A short survey of domain-specific languages for DSP & programmable boards for audio/programmable instruments. DSP専用言語&プログラマブル楽器、開発ボードのサーベイです。画像少なくリンクが多いのでDLするのがおすすめです。
2020/09/01 দӜ([email protected]/matsuuratomoya.com)(ͪΐͬͱ)ߴϨΠϠʔ ΦʔσΟΦΈࠐΈ2020DSPݴޠ/ϓϩάϥϚϒϧϘʔυ/ ΦʔϓϯϋʔυΣΞ1
View Slide
ϓϩάϥϚϒϧΦʔσΟΦϘʔυ2
• STM32FϕʔεɺC++ͷίʔυΛࣗ༝ʹ໐ΒͤΔ• WebϕʔεͷΦʔαϦϯάπʔϧɺGen~/HeavyΤΫεϙʔτͷࢧԉ• MagusͰOwl͚ͷύονͦͷ··͑Δʢ࣮࣭ޙܧػʣ• FreeRTOSͰಈ͍͍ͯΔΒ͍͠• ϑΝʔϜશػछެ։͞Ε͍ͯΔ͕ɺυΩϡϝϯτ΄΅ͳ͠Owl→Magus(Rebel Technology)3
• BeagleBone Black(ͪΐͬͱߴڃͳϥζύΠ)+ઐ༻֦ுϘʔυ+Χʔωϧ֦ு(Xenomai)• ϢʔβʔίʔυC++ʢΛܦ༝ͯ͠ɺFaustPd+HeavyͳͲʣ• LANͰܨ͙ͱWebαʔόϕʔεͷIDE্ཱ͕͕ͪΔ• Linuxϕʔε͕ͩΦʔσΟΦؔ࿈ͷίʔυΧʔωϧΛόΠύε͍ͯ͠ΔͷͰόοϑΝΛ2αϯϓϧ·Ͱ٧ΊΒΕΔ• ແཧΓϢʔϩϥοΫԽͨ͠γϦʔζͱ͔ग़ͯΔʢͰ͔͍ʣBela4
• νοϓɿSTM32H750IBK6(Cortex-M7,400MHz)• AKMͷ2in2out,~192kHz/24bitΦʔσΟΦίʔσοΫͬͯΔ• 64MB SDRAM(wavͱ͔ࡌ͍ͤ͢)• stm32duinoରԠͳͷͰArduino IDEͰ։ൃͰ͖Δ• ઐ༻ͷDSPϥΠϒϥϦDaisySP͕͋Δ• ൈ͖ࠩ͠༰қͳΨϫ͕ϢʔϩϥοΫ/Ϊλʔϖμϧ/ελϯυΞϩϯͱἧ͓ͬͯΓݡ͍Daisy5
• ARMίΞϕʔεͷ͍҆ͯ͘ϚΠίϯϘʔυ(ArduinoIDEରԠ)• νοϓSTMͰͳ͘NXPɺ3.x:Cortex-m4 4.0:Cortex-m7• 4.0ͳΒΫϩοΫ600MHzͰ$19.95• ΦʔσΟΦ༻ͷ֦ுϘʔυɺϏδϡΞϧϓϩάϥϛϯάͰ͖ΔΦʔσΟΦϥΠϒϥϦ͕͋ΔͳͲԻ·ΘΓͷڥ͕ॆ࣮• ΠϯσΟʔϞδϡϥʔܥͰͷར༻࣮ଟ͠ (BASTL ɺɹOrnament&Crimes)Teensy6
• Linux্Ͱಈ͘Lv2ͱ͍͏VSTྨࣅϓϥάΠϯن֨ΛΒͤΒΕΔΪλʔϖμϧ• தී௨ͷLinux on Arm A7 1GHz(ύϫʔͰΰϦԡ͠ײ)• ϨΠςϯγ5ms(ଟόοϑΝαΠζ128ͷԟ෮ʁ)MODDevices MOD Duo7
• ϥζύΠϕʔεɺLuaεΫϦϓςΟϯάͱSuperColliderϕʔεͷԻڹ߹• ORCAͱ͔ɺΞϓϦέʔγϣϯΛೖΕସ͑Δײ֮ͰதΛม͑ΒΕΔ• ΠϯλʔϑΣʔεͷ֦ுmonomeಉ͕࢜த৺Monome Norns8
• Linux্ͰPuredataΛ্ཱͪ͛ͯૢ࡞Ͱ͖Δ• PdݶఆͳͷͰNornsΑΓͰ͖Δ͜ͱͷ෯ڱ͍͕ࢀೖোน͍• HeavyͰͳ͘७ਮͳPdͳͷͰɺύιίϯͰ࡞ͬͨύον΄΅ಈ͔ͤΔͣ• ͜ΕɺΠϯλʔϑΣʔεඪ४ͷϘλϯϊϒݶఆ• தRaspberry Pi Compute Module3+Critter & Guitari Organelle9
• Axoloti http://www.axoloti.com/ ಠࣗύονϟʔϑΥʔϚοτ• midiglue https://sigboost.audio/midiglue/ ϓϩάϥϚϒϧmidiϓϩηοα ಠࣗϏδϡΞϧݴޠଞ10
• RtoRΦϖΞϯϓx2 (ήΠϯͷબࢶ͕-15,-7,-3,-1,2,4,8,16)• DAC12bit͕ͩADC16bit x3• ADCଟॏԽͰ࠷େ36ch͑Δػछ͋Δ• 12bitDACߴपʹϊΠζγΣʔϐϯά͢Ε͑Δͣ• ͱ͍͏͔ɺʹͤͯιϑτΣΞ1bitDACΛ࡞Δͷ͋Γ༨ஊɿSTM32H750Λ͏ͳΒ…11
DSPಛԽݴޠ12
• C++ΤΫεϙʔτ͕ୈҰඪͷݴޠ• Faust• Soul• Vult• ෭࣍తʹC++/CΤΫεϙʔτ͕Ͱ͖Δͷ• Cycling’ 74 Max (Gen~)• Puredata+HeavyDSPݴޠҰཡ13
• ؔܕDSPಛԽݴޠɻจ๏͕ͱʹ͔͘ಛघɻ• جຊC++τϥϯεύΠϥ͕ͩɺArchitectureϑΝΠϧͱݺΕΔDSPҎ֎ͷC++෦ͷςϯϓϨʔτΛ࡞͓ͬͯ͘͜ͱͰɺଟ༷ͳϓϥοτϑΥʔϜʹίϚϯυҰͭͰΤΫεϙʔτͰ͖Δ• ϥΠϒϥϦ͕๛ɻϑΟϧλ/ΦγϨʔλ/ཧϞσϦϯάؔ࿈ΞϧΰϦζϜఏҊऀ͕ॻ͍ͯͨΓ͢ΔͷͰ࣮࣭ϦϑΝϨϯε• ϋʔυपΓͷΤΫεϙʔτFaust14
• ։ൃɾίϯύΠϧ΄΅WebͰ݁(https://faustide.grame.fr/)• routeϓϦϛςΟϒͷಋೖ• soundfileϓϦϛςΟϒͷಋೖ• ࠓޙɺαϯϓϧϨʔτมߋΛՄೳʹ͢ΔondemandϓϦϛςΟϒ͕ೖΔͱ͔ɾɾɾ(ࢀߟ:https://drive.google.com/file/d/1LkT8KviWocnzt6hqRsLlSri5uwVDWI5p/view)࠷ۙͪΐͬͱ͍͘͢ͳͬͨFaust15
• JUCEͳͲΛ࡞͍ͬͯΔROLI͕ओಋͰ࡞͍ͬͯΔDSPݴޠ• खଓ͖ܕʴ෦తʹσʔλϑϩʔͬΆ͍ܗͰ·͋·͋ಡΈ͍͢• Faustಉ༷Web্ͰฤूͰ͖Δ• ·ͩશ෦ͷιʔε͕Φʔϓϯʹͳ͍ͬͯͳ͍ʢHEARTͱ͍͏ɺ ΑΓϨΠϠʔͷதؒදݱ͕͋Δͱ͔ʣ• ΞηοτGUIͳͲͷϚοϐϯάใΛؚΊͨ.soulpatchͱ͍͏ϓϩδΣΫτϑΥʔϚοτ͕͋ΔSoul16
• Leonardo Laguna Ruizͱ͍͏ਓ͕෭ۀతʹ͍ͬͯΔιϑτɾϋʔυγϯηϓϩδΣΫτͷͨΊͷݴޠ• C++,JS,LuaJITͳͲʹΤΫεϙʔτͰ͖Δ• ͜ΕWebͰಈ͔ͤΔ• ίϯύΠϥOcaml(࣮͕៉ྷ)• ΈࠐΈ͚Λҙࣝͨ͠ݴޠ༷Vult17
• FloatΛઐ༻ԋࢉ໋ྩ͕ແ͍ϓϥοτϑΥʔϜ͚ʹfixed-pointͱͯ͠ग़ྗ͢Δ͜ͱ͕Ͱ͖Δ• ؔΛςʔϒϧϧοΫΞοϓʹࣗಈมͯ͘͠ΕΔه๏͕͋ΔʢFaustͰͰ͖Δ͕ɺͪΐͬͱख͕͔͔ؒΔʣ• WavϑΝΠϧΛίϯύΠϧ࣌ʹݻఆྻͱͯ͠ຒΊࠐΜͰ͠·͑ΔΈࠐΈ͚ػೳVult18
• MaxͷதͷGen~ͱ͍͏DSPಛԽύονϑΥʔϚοτ• MaxͱࣅͨܗͷσʔλϑϩʔܕϏδϡΞϧϓϩάϥϛϯάɺgenexprͱ͍͏खଓ͖ܕςΩετͰهड़Մ• genexprͷநԽೳྗͦΜͳʹߴ͘ͳ͍ͷͰϦόʔϒͱ͔࡞Ζ͏ͱ͢Δͱେมɺେنͳมཧ͕ਏ͍• C++ΤΫεϙʔτ͓·͚ͬΆ͘ɺެࣜυΩϡϝϯτͷղઆগͳ͍͕OwlͰੵۃతʹ׆༻͞Ε͍ͯΔ• RebelemscriptenͬͯউखʹWeb্ͰϓϨϏϡʔͰ͖ΔπʔϧΛ࡞ͬͯӡ༻͍ͯ͠ΔΒ͍͠Gen~19
• hvcc: PdύονˠCͷτϥϯεύΠϥ (࣮Python)• libpdͳͲͱશʹҟͳΔ࣮Ͱɺεέδϡʔϥͱ͔ଘࡏ͠ͳ͍ɻPdͷύονΛແཧΓGen~Ϩϕϧͷύονͱͯ͠ղऍ͍ͯ͠Δײ͡• ։ൃݩͷEnzien Audio͕2લʹ࢈ɺطʹձࣾͷWebফ໓• hvccGPLͱͯ͠ެ։͞ΕΔҰϝϯς͞ΕͣɺOSSͱͯ͠։ൃ͕Ҿ͖ܧ͕ΕΔ༷ࢠͳ͠• ͷׂʹPdͷ༷͕ރΕ͍ͯΔ͜ͱ͋ΓҰԠಈ͘ɻBelaOwlͰҾ͖ଓ͖ར༻͞Ε͍ͯΔ(͜ΕRebel͕WebϓϨϏϡʔ࣋ͬͯΔ)Puredata+Heavy20
DSPݴޠൺֱ21C++ϕλ Faust Soul Vult Gen~ Heavy Pd/SCՄಡੑ ˚ × ̋ ̋ ˚ ̋ ̋நԽೳྗ ࣍ୈ ˕ ̋ ̋ ˚ ˚ ˚ΦʔσΟΦϑΝΠϧ˚ ˚ ̋ ̋ ˚ ˚ ࣮̋ߦੑೳ ࣍ୈ ̋ ̋ ̋ ̋ ̋ ˚҆ఆੑ ࣍ୈ ̋ ̋ ̋ ̋ ˚ ̋কདྷੑ ̋ ̋ ʁ ˚ ˚ × ̋WebAudio ˚ ̋ ̋ ̋ ˚ ˚ ×උߟ จ๏͕ಠಛϥΠϒϥϦ๛Ұ෦ιʔεඇެ։, ։ൃ్தΈࠐΈར༻࣮͋Γ,ݸਓ։ൃOSSC++ؔͷ։ൃɾػೳՃඇ׆ൃ։ൃऴྃ OSඞཁ(Owl͕ಠࣗରԠ)(emscripten)
22FaustPuredataSuperColliderHeavyGen~Owl(Magus)BelaOrganelleNornsVultWebAudioEmscriptenC++,CDaisyTeensyMOD DuoLv2 PluginSoulLinux+XenomaiFreeRTOSOSͳ͠ArduinoIDEରԠ
23FaustPuredataSuperColliderHeavyGen~Owl(Magus)BelaOrganelleNornsVultWebAudioEmscriptenC++,CDaisyTeensyMOD DuoLv2 PluginSoul↑ʢਖ਼֬ʹΤΫελʔφϧʣ↓Faust͔ΒίϚϯυҰͭͰॻ͖ग़ͤΔͷESP32ͱ͔
• ਖ਼ɺҰC++Λܦ༝͢ΔͱC++ίϯύΠϥͷ࠷దԽͰࣅͨΓدͬͨΓʹͳΔ(ಛʹClangܥͷLLVMϕʔεͷͷΛͬͨ߹)• ϝϞϦͷޮඞཁͳσʔλΛҰׅͰ֬อ͢ΔͷͰDSPݴޠͷํ͕ଟগ༗ར• Cortex-M4/7DSP͚ͷઐ༻໋ྩηοτ͕͋Δ͕ɺ༗ޮ׆༻͖͠ΕͣSTM༻ϥΠϒϥϦΛͬͨ΄͏͕ૣ͘ͳΔՄೳੑ͋Δ• ͪͳΈʹDaisySPઐ༻໋ྩΨϯΨϯͬͯΔͷ͔ͱࢥ͍͖STL݁ͩͬͨ• ύϑΥʔϚϯεͷͨΊʹΧϦΧϦʹνϡʔχϯάͯ͠ΊͪΌͪ͘ΌಡΈͮΒ͍C++ͷίʔυͷ࣮ߦੑೳΛ100ɺC++ͰಡΈ͢͞࠷༏ઌͯ͠ॻ͍ͨίʔυΛ50ͱ͢ΔͱɺDSPݴޠͰదʹॻ͍ͯ70͘Β͍ͷύϑΥʔϚϯε͕ग़ͤΔΠϝʔδDSPݴޠͷύϑΥʔϚϯεʁ24
༨ஊɿCortex Series·ͱΊ25M3 M4 M4F M7Fixed ○ ○ ○ ○DSP × ○ ○ ○SP Float × × ○ ○DP Float × × × Ұ෦໋ྩηοτ
• DSPDSPॲཧͱͯ͠ίʔυ͕࣮֬ʹͰ͖Δ• ≒։ൃͷϓϩηε͕͖ͪΜͱͰ͖ΔɻੑೳͷͱදݱͷΛ͚ͯߟ͑ΒΕΔ• υΩϡϝϯςʔγϣϯɺཁ݅ఆٛͱͯ͠ͷՁ• ࠷ѱݴޠॲཧܥ͕ࢮΜͰݴޠ༷ΔͷͰղಡ͍͢͠• ϦϯάόοϑΝͱ͔σΟϨΠपΓͷϝϞϦཧؔͷࣦഊ͕ݮΔ• VCVRackͳͲͷιϑτγϯηɺWebͳͲଞϓϥοτϑΥʔϜͱฒߦͯ͠ӡ༻͢ΔՄೳੑ͕͋ΔͳΒ˕DSPݴޠΛ͏ϝϦοτ26
• ಋೖ࣮ɾՄಡੑɾ։ൃͷރΕ۩߹ɺকདྷੑͳͲਖ਼ҰҰ• Faust҆ఆ͍ͯ͠Δ͕ɺΈࠐΈ͕ϝΠϯλʔήοτͱ͍͏Θ͚Ͱແ͍• SoulকདྷతʹΈࠐΈΛ͔ͳΓҙ͍ࣝͯ͠Δ͕ൃల్্• VultখنͰ͋Δ͕ར༻࣮͋Γ• Ϗϧυϓϩηε͕ҰஈෳࡶʹͳΔ• FFT͕བྷΜͩΓɺ෦తʹαϯϓϧϨʔτΛม͑Δͱ͔͕ݫ͍͠DSPݴޠΛ͏σϝϦοτ27
• LinuxFoundation͕ࢧԉͯ͠ɺIntelͷਓ͕த৺ʹ։ൃத• ຯʹLinux Kernel 5.2͔Β͏औΓࠐ·Ε͍ͯΔ• ࠓͷͱ͜ΖαϙʔτIntelܥͷx86CPU&TensilicaͷXtensa HiFiγϦʔζͷΈ߹Θͤ(࣮ػͰࢼ͢ͳΒMinnowBoard Turbot͙Β͍)• ࣮༻తʹͳΔ·Ͱ·ͩԕͦ͏ʢಛʹARMରԠͱ͔ʣ͚ͩͲɺQEMUͰΤϛϡϨʔγϣϯͯ͠Δͷͱ͔Ξϓϩʔνͱͯ͠ࢀߟʹͳΔ༨ஊ: Sound Open Firmwareɹ28
·ͱΊ29
• OSΛ͏͔൱͔ʁ• Linuxͷ߹ɺXenomaiͷΑ͏ͳΧʔωϧ֦ுΛ͢Δ͔ʁ• ALSA System on a Chip(ASoC)SOFͳͲɺΈࠐΈ͚ΦʔσΟΦػೳࠓޙॆ࣮͍͖ͯͦ͠͏• OSΘͳ͍߹ɺArduino IDEରԠorඇରԠʁ• ͳΜ͔ͩΜͩIOͷڞ௨ن֨ͱཱͯͭͭ͋͠͠ΔͷͰɺϘʔυ͕σΟείϯʹͳͬͯସ͑Λޮ͔͍͔ͤ͢ΞʔΩςΫνϟͷબࢶ30
• ϢʔβʔʹϓϩάϥϜॻ͖͑Λ։์͢Δ͔?• ͞ΒʹɺϑΝʔϜॻ͖͑orϗοτϦϩʔυ• OS͋Γͷํ͕ϗοτϦϩʔυͳͲؚΊରԠ͍͢͠• ίετͷΞʔΩςΫνϟબͷஅج४31
• ʮιʔε͕ެ։͞Ε͍ͯΔʯͱʮυΩϡϝϯτ͕͖ͬͪΓ·ͱΊΒΕ͍ͯΔʯશવҧ͏• ϋʔυؚΊͨυΩϡϝϯτ·Ͱ͖ͪΜͱ·ͱΊ͍ͯΔͷMutable Instruments͘Β͍ʢ݁ՌతʹͦΕͰ͕͍ͬͯΔʣ• ͤΊͯReadme͘Β͍ॻ͍ͯ͘Εʢ.inoϑΝΠϧ͕υϯͱஔ͔Ε͍ͯͯࠔΔʣ• ϑΝʔϜΣΞɺճ࿏ਤ/ϨΠΞτؚΊͨڞ༗·͍ͩΖ͍Ζ͍͕͠https://www.writethedocs.org/guide/ͱ͔ࢀߟʹͳΓͦ͏Φʔϓϯιʔεϋʔυͷ࣮ࡍ32
• DaisyDSPϥΠϒϥϦ΄͔Ͱ͍ճ͠ޮ͖ͦ͏ͩ͠ɺSTMϕʔεͷ։ൃͷϓϩτλΠϓͱͯ͠े͑ͦ͏• QEMUͱ͔Ͱϓϩηοα/ϩδοΫϨϕϧͷΤϛϡϨʔλ࡞Δͱ͔ɺΞφϩάɾϝΧ෦ͷγϛϡϨʔλ༻ҙ͓ͯ͘͠ͱ͔ɺ͋Μ·ΓͬͯΔͱ͜ͳ͍͚ͲຊؾͰଓ͖͍ͤͨ͞ͳΒ༗ޮ͔ͦͷଞॴײ33