You are on page 1of 4

LABS PROJECT

MicroTesla Music Synthesizer


meezingen dat het vonkt

Functies
• USB- & MIDI-bestuurd
• Oscillator met Tesla-spoel
• Nauwkeurige frequentiesturing
• Muzikale bedieningselementen
Clemens Valens (Elektor Labs)

In het november/december-nummer 2017 van Elektor [1] hebben we de Spiral MicroTesla gepresenteerd, een
USB-gevoede, platte mini-Teslaspoel die knetterende vonken kon produceren tot wel 4 cm lang. Natuurlijk is
dat een prachtige schakeling, maar erg nuttig is hij niet met zijn vaste vonkfrequenties van 5, 10 en 20 Hz.
In dit artikel laten we zien hoe hij kan worden omgebouwd tot een MIDI-bestuurde muzieksynthesizer.

Muziek maken met Tesla-spoelen werd die in real time met MIDI te besturen zijn: van coöperatieve multitasking, waarbij
populair in 2010, toen de Amerikaanse • vibrato-diepte en -snelheid een scheduler een lijst van taken afwerkt
techno-band ArcAttack had deelgenomen (frequentiemodulatie); en telkens als het kan één van de inge-
aan de TV-show America’s Got Talent. De • pitch bend (frequentieverschuiving); roosterde taken start op een bepaald
Tesla-spoelen van ArcAttack (figuur 1) • portamento (van de ene toon naar moment. Elke taak draait zolang hij wil
zijn metershoog, maar het concept van de andere glijden). en als hij klaar is, geeft hij de besturing
knetterende muziek is heel goed over- De MIDI-data kan naar de TeslaSynth weer terug aan de scheduler zodat de
draagbaar naar onze kaart met zijn worden getuurd via een USB-lijn of, volgende ingeroosterde taak kan worden
vlakke spoel en een ‘naald’ van 3 cm. na het toevoegen van een geschikte gestart. Als een taak nooit afsluit of als
In dit artikel leest u hoe Elektor’s Micro- MIDI-adapter (meer daarover later), via hij niet snel genoeg eindigt, blokkeert hij
Tesla kan worden omgebouwd tot een een traditionele MIDI-bus. de rest van het programma, net als een
Tesla-muzieksynthesizer met MIDI-in- Maar voordat we daaraan beginnen, gaan traditioneel, single-tasking-programma.
gang. De mogelijkheden om het geluid te we eerst eens kijken, hoe de MicroTesla De Mini Tesla heeft drie taken die con-
manipuleren blijven beperkt tot de toon- werkt, vooral qua software. tinu draaien:
hoogte, want we hebben geen manier om 1. Led_task: zorgt ervoor dat de LED’s
het geluid te digitaliseren en terug te voe- Real-time besturingssysteem in een aangenaam ritme knipperen;
ren naar de microcontroller voor verdere Het originele programma van de Spiral 2. Check_switch -taak: detecteert en
bewerking. Verwacht dus geen filtering of MicroTesla is gebaseerd op een klein real- meet het indrukken van de knop
volumeregeling, want die zijn er niet. U time besturingssysteem onder de naam voor het kiezen van de verschillende
krijgt wel enkele frequentieparameters Smalltask. Dit OS werkt met een soort modes;

32 januari/februari 2018 www.elektormagazine.nl


project-info
3. Control_task: een toestandsmachine het erin laten zitten om de functies van
die het opstarten en de 5, 10 en de MicroTesla te behouden. Zo kunt u,
20 Hz plus de muzikale modes ook als u geen MIDI-data bij de hand Tesla spoel
bestuurt. hebt, uw vrienden altijd nog verrassen
Synthesizer Muziek
De takenlijst bevat ook twee taken die met knetterende vonken en lichtbogen.
MIDI RTOS
alleen draaien als het nodig is: melody_ Ik heb voor de oscillator twee timers
task en error_blink. De eerste draait gebruikt: Timer1 voor de frequentie en beginners
als de toonladder moet worden gespeeld, Timer2 voor de pulsduur. Elke keer dat
Æ gevorderden
de tweede wordt alleen uitgevoerd als Timer1 wordt getriggerd, dus als een
experts
de rode LED moet worden uitgescha- periode is afgerond, wordt Timer2 gestart
keld na het verlaten van de donker- of om de pulsduur te bepalen. Smalltask
high-power-modus. gebruikt zelf ook een timer, Timer0, die
Ca. 2 uur
De besturingstaak wordt gestart als de elke 125 µs (8 kHz) wordt getriggerd
schakeling wordt ingeschakeld. Als deze maar dat levert onvoldoende resolutie
‘voelt’ dat alles in orde is, start de LED- voor het genereren van muzieknoten. Bij
Spiraal MicroTesla,
en drukknop-taak en gaat dan over naar 110 Hz (A2) zou de fout al meer dan 1%
MPLAB X, PIC programmer,
een soort van inactieve modus, waarin zijn. Daarom wordt Timer1 in dit project
MIDI-keyboard
hij niets doet. Indrukken van de knop geklokt met 1,5 MHz, wat een resolutie
doet hem telkens overgaan naar een vol- van 667 ns oplevert. Dat beperkt de fout
gende actieve modus, tot hij tenslotte in toonhoogte tot minder dan 0,5% over
Ca. €10
weer terugkomt in de inactieve toestand. het bereik van 0 tot 8 kHz (al gaan wij
niet zo hoog). Timer2, die de pulsduur
Vonken maken bepaalt, heeft dezelfde resolutie, zodat
is heel gemakkelijk de maximaal haalbare frequentie meer
Vervolgens bekijken we hoe de software dan 10 kHz is als we willen vasthouden
ervoor zorgt dat de MicroTesla vonken aan een duty-cycle van 0,7%. buitenspel gezet, want ik heb een taak
maakt. Dat blijkt heel simpel te zijn: alles toegevoegd die werkt met een frequen-
wat nodig is, is een korte puls op de Interrupt-gestuurde ontvangst tie van 1 kHz. Deze zorgt voor het syn-
pen PWREN (IC5, poort RC4, pen 6). In van MIDI-data is het beste chroniseren van de MIDI-commando’s
5-Hz-modus duren de pulsen 1500 µs, in MIDI-data is asynchroon en reist in groep- met de pulsgenerator. De taak ontvangt
10-Hz-modus is dat 750 µs en in 20-Hz-­ jes; soms is er heel veel, meestal is het een bericht als de ontvangst van een
modus 330 µs. In high-power-modus ver- stil. De datasnelheid is 31.250 bits per MIDI-pakket is volbracht (maximaal drie
dubbelt de pulsduur en wordt ook de seconde en een byte duurt 320 µs. Het bytes, afhankelijk van het statusbyte).
MODE-pen (IC5, poort RC2, pen 14) laag ontvangen van MIDI-data zou daarom Het MIDI-commando wordt dan ontleed
gemaakt. Voor de muzieknoten wordt kunnen worden gedaan door de UART van en uitgevoerd. Running status (waarbij
de pulsduur ingesteld op een duty-cy- de microcontroller te laten pollen in een MIDI-data wordt verzonden zonder tel-
cle van 0,7%. Dat wil zeggen dat voor Smalltask-thread. Maar omdat de UART kens een statusbyte te sturen) wordt
een frequentie van 65,41 Hz (de noot een interrupt kan genereren als er een ondersteund; active sense (waarbij peri-
C2) de pulsduur 107 µs zou moeten zijn. byte is ontvangen, verdient interrupt-ge- odiek keep-alive-bytes worden verzon-
Het programma is wat conservatief en stuurde dataontvangst de voorkeur omdat den) niet. Omdat de TeslaSynth monofoon
maakt daar 100 µs van. Ook nu wordt in dat veel minder rekentijd verbruikt. is, kan er maar één noot tegelijk wor-
high-power-modus de lengte van de pul- Ik heb het Smalltask-OS niet helemaal den gespeeld. Indrukken van een toets
sen verdubbeld en de MODE-pen omlaag
getrokken.
En dat is eigenlijk al het hele verhaal.
Geen ingewikkelde besturingsfuncties
of strikte timing die aangehouden moet
worden, in feite zou een 555-timer met
wat schakelaars gemakkelijk de plaats
van de microcontroller kunnen innemen.

De pulsgenerator met variabele


frequentie gebruikt twee timers
Het is de bedoeling om een MIDI-be-
stuurde pulsgenerator te maken met een
variabele pulsduur en frequentie. Nu we
begrijpen hoe de MicroTesla-software
werkt, kunnen we deze nieuwe functi-
onaliteit toevoegen. Eigenlijk is het ori-
ginele Smalltask-besturingssysteem niet
echt nodig voor dit project, maar ik heb Figuur 1: We hebben ArcAttack in 2010 leren kennen tijdens NIWeek in Austin in Texas.

www.elektormagazine.nl januari/februari 2018 33


2.8 1

2.6 0.8

2.4 0.6

2.2 0.4

0.2
2
0
1.8 -180 -150 -120 -90 -60 -30 0 30 60 90 120 150 180
-0.2
1.6
-0.4
1.4
-0.6
1.2
-0.8
1
0 0.2 0.4 0.6 0.8 1 -1

Figuur 2: De functie ex (grijs) en onze simpele benadering (rood) lopen Figuur 3: De kwadratische benadering (rood) van de sinusfunctie (grijs) is
snel uit elkaar bij grotere waarden van x. meer dan goed genoeg voor de laagfrequente vibrato-oscillator.

terwijl er een noot wordt gespeeld zal tot De CC-code voor portamento-besturing
gevolg hebben dat de nieuwe noot wordt doet (nog) niets.
onderdelenlijst gespeeld. De nieuwe toets loslaten, terwijl
de vorige toets nog steeds is ingedrukt Snellere maar minder
zal de vorige noot niet opnieuw starten. nauwkeurige wiskunde
Zie tabel 1 voor de MIDI-implementatie Voor de pitch bending zijn ingewikkelde
van de TeslaSynth. Waar mogelijk zijn wiskundige operaties nodig om muzikaal
standaard Control Codes (CC) gebruikt. acceptabele resultaten te krijgen. Het
CC 1 bijvoorbeeld komt meestal overeen lastigste is het berekenen van de pitch
met het modulatiewiel op een toetsen- bend-waarde vermenigvuldigd met de
bord. De pitch bend van een MIDI-toet- twaalfdemachtswortel van twee, want
senbord gebruikt geen CC code, maar daar is geen C-functie voor. Gelukkig is
heeft zijn eigen MIDI-statusbyte (com- daar een oplossing voor:
mando) 0x0b. De tabel geeft ook een ⎛ ⎛⎜ x ⎞⎟ ⎞
⎛x⎞ ln⎜⎜ 2⎝12 ⎠ ⎟⎟
CC-code voor release-tijd. Dit bepaalt ⎜ ⎟
hoelang het duurt, voordat een noot is 2 ⎝ 12 ⎠
=e ⎝ ⎠

uitgestorven nadat de toets is losgelaten. De natuurlijke logaritme (ln) kan als volgt
De TeslaSynth gebruikt dit om de puls- worden vereenvoudigd:
breedte ‘uit te faden’, maar het resultaat
⎛x⎞
is niet hetzelfde. ⎜ ⎟ ⎛ x ⎞
ln 2⎝12 ⎠ = ⎜ ⎟ ⋅ ln ( 2 ) =
⎝ 12 ⎠
Portamento wordt alleen ln ( 2 )
toegepast bij spelen in x⋅ = x ⋅ 0.057762265
12
legato-stijl
5
3

Onze Smalltask-taak bestuurt ook de In plaats van de twaalfdemachtswortel uit


2

laagfrequente oscillator (LFO) voor de 2 moeten we nu een e-macht berekenen:


vibrato-effecten. Dat wil zeggen dat het
1

41

x⋅0.057762265 )
LFO-signaal wordt gesampled op 1 kHz, e(
dat is ruimschoots snel genoeg voor de
maximum LFO-frequentie van 20 Hz. Daar heeft C wel een functie voor, exp(),
De taak heeft het echt erg druk, want hij maar die is nogal traag bij de gewenste
zorgt ook nog voor het toepassen van de nauwkeurigheid. Door hem te vervangen
pitch bending (±2 halve tonen) en ver- door een afgekapt Taylor-polynoom, krij-
Tabel 1: Zo corresponderen MIDI zorgt de portamento. In de TeslaSynth is gen we een benadering die goed genoeg
Control Change (CC)-berichten dit effect geïmplementeerd als een lineair is voor onze toepassing (figuur 2):
met TeslaSynth-acties.
schuiven van noot A naar noot B. Hoe
CC-code Actie lang het schuiven duurt, is onafhankelijk y = x ⋅0.057762265
1 (0x01) vibrato diepte van de afstand tussen de beide noten. e y ≈ 1+ y + 0.5 ⋅ y 2
5 (0x05) portamento snelheid Verder wordt het alleen toegepast als de
12 (0x0c) vibrato snelheid noten legato worden gespeeld, d.w.z. als Een soortgelijk probleem doet zich voor
de noten worden gespeeld zonder stilte in de LFO waar we de sinus van een fase-
65 (0x41) portamento aan/uit
ertussen. Hiermee kunnen noten met en hoek willen berekenen. De ingebouwde
72 (0x48) release-tijd
zonder portamento worden gespeeld, functie sin() is veel te traag en moet door
84 (0x54) portamento control zonder tussentijds knoppen te bedienen. iets anders worden vervangen. Een vaak

34 januari/februari 2018 www.elektormagazine.nl


gebruikte oplossing is een opzoektabel,
maar daar heeft onze microcontroller te
Hardware, vermogen en radiostoringen
weinig geheugen voor, tenminste met alle De MicroTesla-hardware heeft geen
Smalltask-spullen in het geheugen. Op het MIDI-ingang; er is zelfs geen seriële VCC

Internet vond ik een mooie oplossing die interface. Hij heeft alleen een USB- R2

is gebaseerd op een parabolische bena- poort. Een echte MIDI-input is alleen


R1
1 K2

1k
220R
dering die goed werkt [2], zie figuur 3. nodig als de TeslaSynth moet worden K1 2
IC1
bestuurd door een MIDI-keyboard, 1
4
1 6 5
D1 3
USB-pollen: een taak erbij! voor computergestuurd spelen is de 2
R3
Toevoegen van een USB/MIDI-converter USB-poort voldoende. De MIDI-adap- 5
1N4148
3

100R
2
aan het programma betekent een hoop CNY17-3 4
ter (figuur 4) moet worden verbonden MIDI in
code, maar bijna alles kan letterlijk wor- met IC5, poort RB5 (pen 12). Om dat
VCC
den gekopieerd uit het audio-USB-voor- goed te laten werken, moet R15 worden
beeld van Microchip van de low-pin-count verwijderd (figuur 5). Onder normale
USB-ontwikkelkit voor de PIC18F14K50 omstandigheden kan R3 worden vervan- C3 C1 C2

in het pakket Microchip Libraries for gen door een draadbrug en kunnen C1, 1n 100n 100u 6V3

Applications (MLA). Ik heb het deel dat C2 en C3 worden weggelaten. 160592 - 12


MIDI zendt verwijderd en een MIDI-ont- Welke oplossing u ook kiest (MIDI, USB
vangstgedeelte toegevoegd. of allebei), zonder behoorlijke voor-
USB-MIDI-berichten zijn identiek aan zorgsmaatregelen komt u in de proble- Figuur 4: Een eenvoudige MIDI-input
traditionele MIDI-berichten, alleen staat men vanwege de storing die de Tes- adapter met veel beschermings- en
er een packet header byte voor. Verder la-spoel veroorzaakt. De vonken zien er ontkoppelmogelijkheden.
zijn de MIDI-berichten altijd vier bytes leuk uit, maar vergeet niet dat een eeuw
lang, waarbij de ongebruikte bytes op 0 geleden Tesla-spoelen werden gebruikt
staan. Als we het headerbyte weglaten om vonkzenders te bouwen. Dat doen we tegenwoordig niet meer, maar dezelfde
en de bytes die nul zijn negeren, blijven natuurwetten zijn nog steeds van kracht. Daarom moet u de schakeling afscher-
er normale MIDI-berichten over die onze men, bijvoorbeeld met geaarde (!) stukken aluminiumfolie. Als u dat niet doet, kan
Smalltask-taak kan verwerken. uw computer of zijn USB-poort crashen. Traditionele MIDI is wat toegeeflijker, maar
Het USB-voorbeeld heeft een USB-dri- gemiste pakketten en hangende noten zullen u het leven zuur maken.
ver nodig die pollt met een frequentie De voeding is ook iets om goed op te letten. De MicroTesla (synthesizer) trekt behoor-
van ongeveer 1 kHz, dat is dus een heel lijk wat stroom als hij vonken produceert en rechtstreeks aansluiten op een USB-poort
geschikte kandidaat om te implemente- van uw computer is geen goed idee. Gebruik een USB-hub met een externe voeding
ren als een extra Smalltask-taak. die voldoende stroom kan leveren, of verbind een tweede USB-connector met K4
(D–, D+ en GND) en gebruik een goede USB-voeding die de USB-datalijnen vrij laat.
Nu is het uw beurt
Tot zo ver onze beschrijving van de Tesla-
Synth. De software kan worden gedown-
load van de internetpagina bij dit artikel
VCC
[3]. Het is een MPLAB X-project dat, toen
R1 R27
we dit schreven, goed te compileren was R9
LED1 LED2 LED3 LED4 LED5
10R
10k

met versie v3.60. Om het HEX-bestand


33k

C35 C7

in de microcontroller te programmeren is R14 R15 R17 R16 R23


4u7 220n
een programmer-adapter als de PICkit 3, 1
330R

330R

330R

330R

330R

VDD
ICD3 of ICD4 nodig. Connectors K3 en K4 MCLR 4
RA3/MCLR
VCC
BUTIN 5 16
zijn daarvoor bedoeld. PWREN 6
RC5 RC0
9
RC4 IC5 RC7
(160592) MODE 14
RC2 RB7
10
1 K5
ENA 15 7 ERR
RC1 RC3
Weblinks D– 18
RA1/D–/PGC RB5
12 LED1 2
D+ 19 13 LED2
RA0/D+/PGD RB4 MIDI in
R25 11 LED3
[1] www.elektormagazine.nl/160498 RB6 3
8 LED4
PIC18F14K50-I/SS RC6
1k5

[2] http://forum.devmaster.net/t/
17
fast-and-accurate-sine-cosine/9648 VUSB
VSS RA5/OSC1 RA4/OSC2
[3] www.elektormagazine.nl/160592 20 2 3
S1 C12 C6 C13 X1
12MHz
Mounting holes
220n 220n 10n

in de store
ª160592-1 160592 - 11
MIDI-input adapter print
ª160498-91
Spiral MicroTesla module Figuur 5: Verbind de MIDI-inputadapter met poort RB5. Vergeet niet R15 te verwijderen.

www.elektormagazine.nl januari/februari 2018 35

You might also like