Midi valdiklio platforma

konkursas

#1

Trumpas aprašymas

USB MIDI valdiklis, naudojamas groti muziką virtualaus mikšerio pagalba. Taip pat man svarbu buvo daryti kuo mažiau prielaidų apie galutinį prietaiso formatą, palaikant agreguotą dizainą.

Muzikiniai prietaisai – sintezatoriai ir vadinamieji DJ controller’iai įprastai naudoja seną protokolą (MIDI) bendraudami tarpusavyje arba su kompiuteriu. Šiais laikais net gan lėti mikrovaldikliai gali prisijungti prie MIDI tinklo, tačiau MIDI dažnai emuliuojamas per kitas fizines jungtis (dažnai per USB arba net internetą). Savo projektui aš naudoju Raspberry Pi Zero kaip smegenis ir jos benrdauja su kompiuteriu būtent per USB. Kol kas naudojamas USB OTG ir tiksliau, MIDI gadget linux modulis, kad nereikėtų rašyti naujų driver‘ių.

Pagrindiniai tikslai

Šiam projekte man buvo labai svarbu suplanuoti architektūrą taip, kad būtų lengva keisti funkcionalumą arba pridėti naujų elementų. Man svarbu susikurti tokį prietaisą, kurį malonu naudoti, ir kuris būtų visapusiškai pajėgus. Tai pagrinde pasiekiau suskaldydamas sistemą į mažas dalis – vietoj vieno valdiklio, naudoju bent tris, kiekvienam priskirdamas tiksliai apibrėžtą funkciją. Taip pat projekto kaina – labai svarbi, juk galima ne taip brangiai nusipirkti išbandytą komercinį MIDI valdiklį.

Funkcinė diagrama

image
Trumpai apibendrinant: projekto apimtis yra surinkti signalus (techniškai, signalų pokyčius) iš fizinių jutiklių juos apdoroti ir perduoti kompiuteriui.

Dalių sąrašas

  • Reguliuojamos varžos. Kol kas naudojau ir sukiojamas ir slankiojamas reguliuojamas varžas (visos tiesiškai kintančios), mat patogu skirtingas funkcijas asocijuoti su skirtingais veiksmais. Tiksliau, sukiojamos varžos 10K Ohm, o slankiojamos 50K Ohm, siųstos tiesiai iš kinijos per ebay, tačiau nėra didelio skirtumo, kokio dydžio ar tipo varžos naudojamos, jei tik iš jų įmanoma sudaryti įtampos daliklį, kurį perduodame į ADC (Analog to Digital Converted) modulį:
  • ADS1015 – moduliai paverčiantys analoginį signalą, dažniausiai įtampą 0-5V, į skaitmeninį signalą, šiuo atveju tai I2C, bet galima naudoti bet kokią alternatyvą, kurią gali interpretuoti valdiklis ESP8266
  • Mygktukai ir Arduino Nano, čia Arduino atsakingas už mygtukų paspaudimų susekimą ir interpretavimą, vėliau tokius įvykius išsiunčiant į tolimesnį valdikį naudojant I2C protokolą.
  • Raspberry Pi Zero, atsakingas už įvykių manipuliavimą ir persiuntimą kompiuteriui USB MIDI protokolu. Taip pat noriu ateityje pridėti ekraną, kuriame būtų vaizduojama dabartinė pulto būsena, ir labai reikėtų tiesioginio audio transliavimo iš kompiuterio į išorinį papildomą išėjimą. Vėliau padiskutuosiu šių reikalavimų iškeliamas problemas.

Programinė dalis

Iš pradžių noriu trupmai nupasakoti kaip veikia mano parašyta arduino bilioteka InputReader, tam sukūriau trumpą animaciją, kuri parodo kaip veikia įvykių saugojimas nedideliame pre-alokuotame buferyje (centrinė bibliotekos dalis):

Visi įvykiai generuojami nuskaitant sensorių vertes (ar tai mygtuko paspaudimas, ar varžos daliklio įtampa) ir lyginant šias vertes su buvusiomis. Tada, jei matomas pasikeitimas, jis saugomas buferyje kaip sensoriaus įvykis, ir iš buferio tolesnės grandies dalies prašymu siunčiamas aukštyn valdiklių grandimi. Įvykį sudaro trys skaičiai: sensoriaus tipas, sensoriaus ID, ir nauja verte.

Įvykių buferis specializuotas: aš stengiausi jo veikimą pritailyti sensorių verčių pasikeitimų skenavimui, tad su kaikuriais įvykiais elgiamasi šiek tiek nestandartiškai:

  • Reguliuojamų varžų įvykiai gali būt perrašyti naujomis vertėmis, kad nereikėtų siųsti pasenusios informacijos,
  • Buferyje gali būti tuščių vietų, nes įvykius aprašantys objektai dažnai pašalinami ir kuriami, o procesoriuje nėra daug atminties, todėl geriau atminties išsidėstymu rūpintis savomis rankomis.
  • Taip pat yra galva, kuri išsiunčia (pašalina) įvykį, ji cikliškai eina per visas užpildytas buferio vietas, kad, tarkim, vienu metu reguliuojant dvi varžas, abiejų pasikeitimai būtų atspindimi toliau grandinėje vienu metu.

Tokia programa su skirtingomis sensorių konfiguracijomis veikia Arduino Nano valdiklyje, atsakingame už mygtukų ir optinio detektoriaus skenavimą, ir taip pat tokia programa veikia ESP8266 valdiklyje, atsakingame už visų sensorių verčių skenavimą ir tada įvykių peradresavimą į Raspberry Pi.

Kita svarbi dalis, Raspberry Pi valdantis python script‘ukas, atsakingas už įvykių pavertimą į MIDI signalus ir jų perdavimą kompiuteriui. [kodo gabaliukas bus vėliau] Kol kas čia laikoma ir valdiklio būsena, kuri gali pakeisti kaip kuriami MIDI signalai, pastumiant visus identifikatorius nustatytu žingsniu. Taip nusprendžiau padaryti, kad ribotą kiekį sensorių galima būtų naudoti skirtingiems veiksmams, pavyzdžiui: turiu tik vieną optinį encoder‘į, tačiau kompiuteris gali interpretuoti tai kaip kitą sensorių, jei ID kitoks, taip lengvai galima sukurti kontroles, kurios yra virtualios – pirmame režime kontroliuoju kairę dainą, antrame režime valdau dešinę dainą.

Dizainas

Kolkas turiu tik savo pirmajį prototipą, mat juos spausdinuosi skolintu 3d spausdintuvu. Taip pat čia mano pirmas bandymas naudojant tokį spausdintuvą, tad mygtukai ne visai funkcionalūs - dar testuoju skirtingus išsidėstymus ir dizainus.

Apibendrinimas

Aprašyta sistema veikia pakankamai gerai, tačiau pastaruoju metu užsinorėjau papildyti valdiklį ekranu, kuriame galėčiau rodyti informaciją apie pulto būseną ir papildomu audio išėjimu, į kurį garsą reikėtų transliuoti tiesiogiai iš kompiuterio. Tačiau pabandžius siųsti garso duomenis per MIDI sysex žinutes, nustebau koks mažas duomenų perdavimo greitis – iki 50kb/s. To neužtenka jokiam gyvam garsui perduoti, tad dar pabandžiau naudoti kitą sąsają tarp kompiuterio ir Raspberry Pi, tai yra virtual lan modulį, kur sukuriama interneto jungtis tarp kompiuterio ir Pi, ir čia MIDI sysex žinučių sparta pakilo iki 1.2Mb/s, tačiau atsirado nepatogus maždaug 3ms langelis, kol žinutės pasiekia kompiuterį. Kol kas, planuoju išbandyti kitą valdiklį vietoj Raspberry Pi Zero, kaip interpetatorių kompiuteriui, mat norint pakeisti jau parašytą linux kernel kodą atsakingą už USB, reikia gan daug infrastruktūros ir, galų gale, aš nelabai naudoju Linux suteikiamas galimybes, tad žiūriu į STM32F4DISCOVERY valdiklius, kaip galimą alternatyvą, norint pasiekt tiesioginį garso transliavimą. Kitu atveju, galima naudoti tam skirtą hardware - žiūriu į PCM2901 iš texas instruments ir panašius IC.

Šiuo metu projektas aktyviai vystomas, tačiau jau galima parodyti šiek tiek funcionalumo:

ir prastai įrašytas Video :smiley:


Konkursas #2018_PAVASARIS [BALSAVIMAS]
Konkursas #2018_PAVASARIS [BALSAVIMAS]
#2

Midi valdikliai ir mini sintezatoriai mane visada žavėjo įdomiais dizainais su visokiais spalvotais spaudomais, slankiojančiais sensoriais :slight_smile:

image

Šitas darbas man įdomus nes tai visiškai nežinoma man sritis mikrovaldiklių temoje - AUDIO. Todėl bus be galo įdomu matyti, kaip platforma progresuoja, kaip pavyks adaptuoti STM32F4DISCOVERY. Šiuo momentu kaip tik mėginu savo projektui pritaikyti ST32f405RG+micropython.

Ar reisingai suprantu, kad šitam video pocket operator yra tik garso sintezatorius, o Midi valdiklis - telefono programėlė? Ar tas pocket operator ir Midi valdiklio funkcijas atlika :confused: ?


#3

Kiek mano trumpa paieška atskleidė - tai tas pocket operator yra gan paprastas sampler’is ir jį valdo iš telefono einantys MIDI signalai (tam video projekto esmė - tarpininkavimas tarp MIDI iš telefono ir sampler’io mygtukų)