
Un PLAYER C++ senza dipendenze per suonerie Yamaha SMAF (.mmf): il formato di suoneria polifonica dei chip per telefoni MA-3 / MA-5 degli anni 2000, ricostruito con il proprio motore FM senza ROM. Il player aperto che nessuno ha finito. Provato in FXChainPlayer.
di Akustikrausch (Andreas Wendorf)
un piccolo riproduttore (senza dipendenze) per suonerie Yamaha SMAF (.mmf) in c++.
gli fornisci uno di quei file che facevano andare il tuo samsung, sharp o panasonic
deedle-deedle-dee nel 2004, e lui ti restituisce audio stereo pulito. niente telefono, niente
firmware, niente sample rom. solo il chip FM, ricostruito in software.
questo è il suono di un decennio intero che quasi nessuno si è preoccupato di preservare in codice aperto. ci sono milioni di questi file ancora in circolazione, e nessuno ha mai completato un player aperto per loro: i tentativi si sono arenati nel 2004 o aggirano completamente il sintetizzatore. quindi eccone uno in c++, scritto partendo dal formato, con il proprio core FM sintetizzatore.
🎧 questo codice è incluso in un prodotto reale: FXChainPlayer. un player audio nativo per Windows che riproduce le tue vecchie suonerie insieme ai tuoi FLAC, SID e moduli Amiga. è lì che questo motore gira ogni giorno, su un corpus di centinaia di suonerie reali di telefoni. scarica il player per ascoltare, oppure continua a leggere per sapere come funziona il chip.
la serie Yamaha MA (YMU762 = MA-3, YMU765 = MA-5) era il chip audio all'interno
di una grandissima fetta dei telefoni dei primi anni 2000. è un vero sintetizzatore FM, un cugino stretto
dei chip OPL/OPN dell'era AdLib e Sega Genesis, rimpicciolito per un
telefono. i file che riproduceva, SMAF (.mmf), contengono una partitura FM più eventuali
campioni ADPCM. la suoneria polifonica è nata qui.
poi arrivarono gli smartphone, le suonerie mp3 presero il sopravvento, e l'intero formato morì silenziosamente. yamaha ha tolto offline il suo sdk. e a differenza delle scene Amiga o C64, quasi nessuno ha scritto un emulatore. ciò che esiste:
umjammer/vavi-sound (java) analizza e riproduce smaf, ed è un ottimo
riferimento comportamentale, ma non fa affatto sintesi FM: riconfeziona i
suoni come general-midi e lascia che il synth di java li approssimi. ed è java.quindi un player nativo, con licenza permissiva, senza rom del vero chip FM non esisteva. questo è quello. ogni byte del parser e ogni operatore del synth è stato scritto partendo dalla descrizione pubblica del formato SMAF più molta osservazione di file reali in un hex editor, mai copiando un altro player.
il motore è composto da cinque piccoli pezzi, ciascuno testabile autonomamente:
src/
smaf_file the MMMD container: big-endian TLV chunks (CNTI/OPDA/MTR/ATR),
two score generations (HandyPhone for MA-1/2, Mobile for MA-3/5)
ma_player the two event decoders (+ okumura huffman for the packed
variant), a scheduler that runs in milliseconds like the chip
did, and the render loop that drives a pool of FM voices
ma_fm_core the FM DSP: 2-op and 4-op operators, exponential ADSR envelopes,
the OPL-style connection algorithms, and its own general-midi
approximation patch bank
smaf_voice decodes the yamaha voice sysex blobs (VM35 for MA-3/5, VMA for
MA-1/2) into FM patches, including the MA-3 bit-packed form
yamaha_adpcm the YM2608-family 4-bit adpcm codec, for the sampled voices
il modello temporale è la bella sorpresa: SMAF non ha eventi di tempo, il tempo è puramente metrico (tempo evento = somma delle durate per una timebase, in millisecondi), quindi un tick corrisponde direttamente a un millisecondo e poi a campioni. il core FM gira direttamente alla tua frequenza di uscita, quindi non c'è ricampionamento sul percorso del synth.
i chip MA portavano anche una piccola rom di campioni general-midi così una suoneria poteva dire "riproduci programma 5" e ottenere un pianoforte preimpostato. quella rom è di yamaha, non è mai stata resa pubblica, e questo progetto non la include, non la vuole, e non la inserirà mai. questa è una linea dura.
invece, ma_fm_core porta la propria banca di patch FM costruita a mano che sostituisce
la rom: un file che chiede "programma 5" ottiene una voce FM plausibile della
famiglia giusta. non sarà identico bit a bit a un telefono del 2003, e questo è il
compromesso onesto. ciò che ottieni è la vera partitura FM, la vera temporizzazione delle note, il vero
ADSR, suonati da un sintetizzatore proprio. riconosciuto, e suona.
i file che portano le proprie voci personalizzate (molti lo fanno) suonano esattamente come composti, perché quelle voci vivono nel file, non nella rom.
cmake -B build && cmake --build build
./build/smaf-render your_ringtone.mmf out.wav 30
oppure collega la libreria al tuo codice:
#include "smaf_file.h"
#include "ma_player.h"
using namespace fxchain::smaf;
SmafFile file;
file.parse(bytes.data(), bytes.size()); // MMMD container
MaPlayer player;
player.init(file, 44100); // build voices + decode the score
float buf[1024 * 2]; // interleaved stereo
int frames = player.render(buf, 1024); // pump the synth
43 79 06 7F 03) che alcuni file puramente drum-kit
contengono i loro campioni; e le waveshapes più alte specifiche per SD-1. vedi
ROADMAP.md..mld) (un cugino; vedi
ROADMAP.md m3).questo parser è pensato per processare file non fidati, quindi è scritto in modo difensivo: ogni lunghezza di chunk è limitata al buffer reale, la decompressione Huffman ha controlli su nodo + profondità e un tetto di output, e i decodificatori di eventi hanno limiti di iterazione + eventi totali. invece di crashare, degrada a "non un file SMAF valido". dettagli e segnalazione in SECURITY.md.
src/ il motore (quattro piccole unità di traduzione più un codec header-only, nessuna
dip.). example/smaf-render.cpp il CLI wav in meno di 100 righe. CMakeLists.txt
costruisce una libreria statica smaf più l'esempio. tutto qui.
Licenza Apache 2.0 (vedi LICENSE). il parser e il synth sono lavoro originale; nessun codice di terze parti è incluso, e nessun materiale rom o sdk yamaha è incluso. la conoscenza del formato è derivata dalle specifiche pubbliche SMAF e dall'osservazione.
non affiliato, autorizzato o approvato da Yamaha. "SMAF" e i nomi dei chip MA sono di Yamaha. questo è un lavoro di interoperabilità: un player indipendente di un formato di file aperto, costruito senza alcun codice yamaha o la rom campione protetta.
saluti a tutti coloro che ricordano ancora il suono della propria suoneria.