
Yamaha SMAF (.mmf) रिंगटोन के लिए एक dependency-free C++ प्लेयर: 2000 के दशक के MA-3 / MA-5 फोन चिप्स का polyphonic-ringtone प्रारूप, अपने स्वयं के ROM-free FM इंजन के साथ पुनर्निर्मित। वह खुला प्लेयर जिसे किसी ने पूरा नहीं किया। FXChainPlayer में सिद्ध।
द्वारा: Akustikrausch (Andreas Wendorf)
एक छोटा, निर्भरता-मुक्त यामाहा SMAF रिंगटोन प्लेयर (.mmf) C++ में।
आप इसे उन फ़ाइलों में से एक देते हैं जिन्होंने 2004 में आपके Samsung, Sharp या Panasonic फ़ोन को डीडल-डीडल-डी बजाया था, और यह आपको साफ़ स्टीरियो ऑडियो देता है। कोई फ़ोन नहीं, कोई फ़र्मवेयर नहीं, कोई सैंपल ROM नहीं। बस FM चिप, सॉफ़्टवेयर में पुनर्निर्मित।
यह एक पूरे दशक की ध्वनि है जिसे लगभग किसी ने ओपन कोड में संरक्षित करने की जहमत नहीं उठाई। लाखों ऐसी फ़ाइलें अभी भी मौजूद हैं, और किसी ने भी उनके लिए एक ओपन प्लेयर कभी पूरा नहीं किया: प्रयास 2004 में रुक गए या सिंथ को पूरी तरह से बायपास कर दिया। तो यहाँ एक C++ प्लेयर है, जो फ़ॉर्मेट से शुरू करके लिखा गया है, अपने स्वयं के FM सिंथ कोर के साथ।
🎧 यह कोड एक वास्तविक उत्पाद में शामिल है: FXChainPlayer. एक नेटिव विंडोज़ ऑडियो प्लेयर जो आपके पुराने रिंगटोन को आपके FLAC, SID और Amiga मॉड्यूल के बगल में बजाता है। यहीं पर यह इंजन हर दिन चलता है, सैकड़ों वास्तविक हैंडसेट टोन के कोर्पस पर। सिर्फ सुनने के लिए प्लेयर ले लें, या चिप कैसे काम करता है, यह जानने के लिए आगे पढ़ें।
Yamaha MA श्रृंखला (YMU762 = MA-3, YMU765 = MA-5) 2000 के दशक के प्रारंभिक फ़ोनों के एक बड़े हिस्से में लगी साउंड चिप थी। यह एक वास्तविक FM सिंथेसाइज़र है, जो एडलिब और सेगा-जेनेसिस युग के OPL/OPN चिप्स का करीबी चचेरा भाई है, जिसे हैंडसेट के लिए छोटा किया गया। इसने जो फ़ाइलें बजाईं, SMAF (.mmf), उनमें एक FM स्कोर और वैकल्पिक ADPCM सैंपल शामिल होते हैं। पॉलीफ़ोनिक रिंगटोन का जन्म यहीं हुआ।
फिर स्मार्टफ़ोन आए, MP3 रिंगटोन ने कब्ज़ा कर लिया, और पूरा फ़ॉर्मेट चुपचाप मर गया। यामाहा ने अपना SDK ऑफ़लाइन कर दिया। और अमीगा या C64 दृश्यों के विपरीत, लगभग किसी ने एमुलेटर नहीं लिखा। जो मौजूद है:
umjammer/vavi-sound (Java) SMAF को पार्स और बजाता है, और यह एक शानदार व्यवहारिक संदर्भ है, लेकिन यह FM संश्लेषण बिल्कुल नहीं करता: यह टोन को जनरल-मिडी के रूप में पुनः लपेटता है और Java के सिंथ को उनका अनुमान लगाने देता है। और यह Java है।तो वास्तविक FM चिप का एक नेटिव, अनुमोदक-लाइसेंस प्राप्त, ROM-मुक्त प्लेयर मौजूद नहीं था। यह वही है। पार्सर का हर बाइट और सिंथ का हर ऑपरेटर सार्वजनिक SMAF प्रारूप विवरण और एक हेक्स एडिटर में वास्तविक फ़ाइलों को बहुत देर तक घूरने से लिखा गया था, किसी अन्य प्लेयर की नकल करके नहीं।
इंजन पाँच छोटे टुकड़े हैं, प्रत्येक अपने आप परीक्षण योग्य:
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
टाइमिंग मॉडल सुखद आश्चर्य है: SMAF में कोई टेम्पो इवेंट नहीं है, समय पूरी तरह से मीट्रिक है (इवेंट समय = अवधियों का योग गुणा टाइमबेस, मिलीसेकंड में), इसलिए एक टिक सीधे एक मिलीसेकंड और फिर सैंपल में मैप होता है। FM कोर आपकी आउटपुट दर पर सीधे चलता है, इसलिए सिंथ पथ पर कोई रीसैंपलिंग नहीं है।
MA चिप्स में एक छोटा जनरल-मिडी सैंपल ROM भी था ताकि एक रिंगटोन "प्रोग्राम 5 बजाए" कह सके और एक प्रीसेट पियानो मिले। वह ROM यामाहा का है, इसे कभी सार्वजनिक रूप से डंप नहीं किया गया, और यह प्रोजेक्ट इसे शिप नहीं करता, इसे नहीं चाहता, और इसे कभी बंडल नहीं करेगा। यह एक कठोर रेखा है।
इसके बजाय, ma_fm_core में अपना स्वयं का हाथ से बनाया गया FM पैच बैंक है जो ROM के लिए खड़ा है: "प्रोग्राम 5" माँगने वाली फ़ाइल को सही परिवार का एक प्रशंसनीय FM वॉयस मिलता है। यह 2003 के हैंडसेट के बिट-समान नहीं होगा, और यही ईमानदार व्यापार है। आपको मिलता है असली FM स्कोर, असली नोट टाइमिंग, असली ADSR, अपने स्वयं के सिंथ द्वारा बजाया गया। पहचाना गया, और यह बजता है।
जो फ़ाइलें अपने खुद के कस्टम वॉयस रखती हैं (उनमें से बहुत सारी ऐसी हैं) वे बिल्कुल लेखक के अनुसार सुनाई देती हैं, क्योंकि वे वॉयस फ़ाइल में रहते हैं, ROM में नहीं।
cmake -B build && cmake --build build
./build/smaf-render your_ringtone.mmf out.wav 30
या लाइब्रेरी को अपने कोड में जोड़ें:
#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) जिसमें कुछ शुद्ध ड्रम-किट फ़ाइलें अपने सैंपल रखती हैं; और SD-1-विशिष्ट उच्च तरंगरूप। ROADMAP.md देखें।.mld) सहोदर प्रारूप (एक चचेरा भाई; ROADMAP.md m3 देखें)।यह पार्सर अविश्वसनीय फ़ाइलों को खाने के लिए है, इसलिए इसे रक्षात्मक रूप से लिखा गया है: प्रत्येक चंक की लंबाई वास्तविक बफ़र से क्लैम्प की जाती है, हफ़मैन इनफ़्लेट में नोड + डेप्थ गार्ड और एक आउटपुट सीलिंग है, और इवेंट डिकोडर में इटरेशन + कुल-इवेंट कैप हैं। यह क्रैश होने के बजाय "मान्य SMAF फ़ाइल नहीं" में डिग्रेड होता है। विवरण और रिपोर्टिंग SECURITY.md में।
src/ इंजन (चार छोटी ट्रांसलेशन यूनिट और एक हेडर-ओनली कोडेक, बिना डिप्स)। example/smaf-render.cpp WAV CLI 100 पंक्तियों से कम में। CMakeLists.txt एक स्टैटिक smaf लिब और उदाहरण बनाता है। बस इतना ही।
Apache लाइसेंस 2.0 (LICENSE देखें)। पार्सर और सिंथ मूल कार्य हैं; कोई तृतीय-पक्ष कोड वेंडर नहीं किया गया, और कोई यामाहा ROM या SDK सामग्री शामिल नहीं है। प्रारूप का ज्ञान सार्वजनिक SMAF स्पेक और अवलोकन से आया।
यामाहा से संबद्ध, अधिकृत या समर्थित नहीं। "SMAF" और MA चिप के नाम यामाहा के हैं। यह अंतर-संचालन कार्य है: एक खुले फ़ाइल प्रारूप का एक स्वतंत्र प्लेयर, बिना किसी यामाहा कोड या संरक्षित सैंपल ROM के बनाया गया।
उन सभी को नमस्ते जो अब भी याद करते हैं कि उनकी रिंगटोन कैसी लगती थी।