Jak jsem oživoval MIDI USB Stylophone (Styloboard)

Jak jsem nedávno psal v mém ohlédnutí za pražským Maker fairem 2021, koupil jsem si na místě od spolku Takt součástky na takovou PCB verzi legendárního stylofonu. Čas jej rozchodit!

O co jde? Jedná se o projekt vycházející ze Stylofonu (v angličtině Stylophone), hudebního nástroje z roku 1967 sestávajícího z klávesnice, stylusu a reproduktoru. Tahle retro-věc zažila návrat v roce 2007 a čas od času na ni narazíte (nebo aspoň já narážím) v krátkých videích na sociálních sítích.

Původní stylophone, zdroj: CC BY-SA 3.0 Alex Ashbourne

Hurá do budoucnosti, Styloboard od spolku Takt má formu PCB s „klávesami“ na odporovém žebříku, mozek v podobě Attiny85 (s ADC napojeným na odporový žebřík) a pár součástek pro bezproblémovou komunikaci s USB (ale o tom, ha ha, o něco později). Na internetu narazíte na několik podobných projektů, mně osobně se líbí tahle „Stylocard“ ve formě vizitky.

Bývá tradicí, že když něco vypadá jednoduše, jednoduché to nebude. Ne, že bych si nevěřil, ale překvapilo mě, že na první dobrou attiny85 po mém pájení vůbec komunikuje přes USB s počítačem. Součástí pájení totiž byla rovnou i oprava (prohození) dvou cest na desce (jak se později ukáže, zbytečná).

Jenže styloboard nedělal, co měl. Místo posílání stisknutých not „vyblil v MIDIštině“ úplně všechny noty několikrát za sebou (což samo o sobě zní divoce elektronicky, jinak nic) a jinak nic. Tlačítka pro zvýšení a snížení oktávy (tipuju) fungovala, takže jsem předpokládal, že chyba je ve firmware nahraném na attiny85. K tomu jsem ale přístup neměl a na facebooku Taktu nikdo nereagoval. Následovalo ještě jedno prohřátí všech spojů a přeměření odporů (a odstranění jednoho zkratu z nedokonale odleptaného spoje), aniž by to problém vyřešilo.

Takhle nějak (jen o kilometr delší) vypadal výstup styloboardu. Trochu nudná melodie.

Naštěstí jsem prozřetelně neumístil attiny85 na desktu napevno, ale do patice, takže nastal čas na experimenty. Původní mikrokontrolér šel ven a místo něj přistálo jiné prázdné attiny (když si koupíte 10 attiny85 na aliexpressu, tak se vám jednou, za několik let, prostě budou hodit). O hodinu později plnou vzpomínání, jak vlastně attiny naprogramovat (najít arduino, rozjet IDE s podporou attiny desek, nastavit arduino jako programátor, vypálit bootloader) jsem byl připravený nahrát vlastní ovládací firmware.

Jenže tady člověk začal tušit, že to nebude jen tak

Samotná MIDI komunikace je jednoduchý sériový protokol s nestandardní rychlostí poslaný přes MIDI kabel jinému zařízení. Takže i samotný kód pro attiny je vcelku jednoduchý. Tedy do chvíle, kdy si uvědomíte, že vy neposíláte standardní sériovou komunikaci přes MIDI kabel. Ale že posíláte komunikaci přes zařízení připojené přes USB rozhraní, tvářící se jako zvukové MIDI zařízení. A taky, že attiny85 nemá v sobě podporu pro USB.

Takže znovu a lépe. USB komunikace se dá na attiny simulovat pomocí softwarové implementace. Využívá toho třeba docela známý projekt DigiSpark (attiny na destičce připojitelné přímo do USB, taky ji mám doma), dokonce tak dobře, že přes USB nahrajete kód přímo do mikrokontroléru skrz speciální Moebius bootloader. Hledání mě zavedlo až k projektu V-USB-MIDI, který softwarově implementuje základní komunikaci přes USB. Tahle knihovna je napsaná pro ATmega16, ale existuje její modifikace pro Digispark a tedy pro attiny85.

Popral jsem se s konfigurací USB a nahrál demo do mikrokontroleru… a nic. Počítač viděl jen neznámé zařízení, které odmítlo vrátit popisovač. Tady už jsem si začal říkat, že se přes USB magii nedostanu, protože se to bez speciálního vybavení bude blbě debuggovat.

Ale zkusil jsem ještě chvíli procházet projekty využívající V-USB a attiny85, až jsem narazil na jeden, kde mě trkla do nosu zajímavá věc: Attiny85 může běžet interně na 16 MHz. Ve standardní knihovně pro arduino IDE tahle možnost není, ale existuje způsob, jak si 16 MHz interní chod přidat.

Taky jsem si díky nalezenému projektu uvědomil, že v rámci konfigurace je ve V-USB (respektive té digisparkové odnoži) potřeba zkontrolovat definici pinů. Provedl jsem a prohodil výchozí piny (3 a 4 pro tenhle konkrétní styloboard). Čímže se vracím k začátku, kdy jsem do desky zbytečně řezal a propojoval něco, co šlo prohodit softwarově. 😅

#elif defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)
#define USB_CFG_IOPORTNAME      B
#define USB_CFG_DMINUS_BIT      4 // byla 3
#define USB_CFG_DPLUS_BIT       3 // bylo 4

Po zvýšení taktu mikrokontroleru, opravě konfigurace (ono je sice USB_CFG_CLOCK_KHZ nastaveno defaultně na (F_CPU/1000), ale já to předtím přepočítal pro 8 Mhz) a franken-styloboard 😁 se konečně začal hlásit a posílat testovací notu!

#include <DigiMIDI.h>
#https://github.com/heartscrytech/DigisparkMIDI
DigiMIDIDevice midi;
void setup() {
}
void loop() {
  // put your main code here, to run repeatedly:
  midi.update();
  midi.delay(500);
  // Note number, velocity (opt=channel)
  midi.sendNoteOn(62,32);
}

Následně mě už čekala jen ta jednodušší část, zapojit AD převodník v attiny85 tak, aby na základě hodnot posílal správné noty MIDI protokolem přes USB.

Pak stačí už jen najít vhodný midi syntetizér (dost jich je online, třeba Midi City nebo Dot Piano, které uvidíte i promítnuté v ukázkovém videu.