MIDI Project voor Elektron Digitakt / MIDI Router

DreamXcape

Stamgast
Lid sinds
14 december 2017
Berichten
214
Hoi Synthforumers,

Ik ben bezig met een midi project wat ik graag met jullie wil delen. En omdat er nu echt vordering in zit kan ik wel wat input gebruiken.

De belangrijkste functies zijn als volgt:

Allereerst bediening voor de Elektron Digitakt:
Dit veranderd de Digitakt in een 2-part mono of polyfonische synth.

Op dit moment aanwezig:
- Interne MIDI clock, instelbaar tot 0.1 BPM nauwkeurigheid
- Portamento for elk kanaal/part (always/legato)
- Noot geheugen voor een betere speelstijl in mono modus
- Pitch Bend voor elk kanaal/part
- Aparte tune en fine-tune midi CC's
- Toewijsbaar Mod Wheel, Expression, Breath Control en AfterTouch voor elk kanaal/part
- Selecteerbaar split-punt voor verdeling van de kanalen
- Unison voor mono modus
- Unison detune en spread voor mono modus
- Strum modus voor extra creativiteit :)
- Ingebouwde MIDI loopback functie
- MIDI feedback voor volledige controle vanaf de Digitakt zelf
- Bediening met een launchpad Pro of via midi CC's

Nog toe te voegen:
- Glissando
- Clock divide en delay voor elk apparaat
- Poly unison en detune
- Split unison modus voor meerdere, verschillende samples per voice
- Slice modus (gelijk verdeelde slices met setting voor aantal slices)
- Constant rate Portamento/Slide (zoals op de Digitone)
- Direct pattern switch
- 2-part keyboard split
- Granulaire modus
- Wavetable modus (voor gebruik met Serum wavetables)
- MPE ondersteuning (hier kan ik wel wat inzicht gebruiken)
- Song mode
- Ondersteuning voor meer veelgebruikte controllers(bcr2000, andere launchpads etc.)
- Bediening met MidiFighter 64


Uiteindelijk komt hier dus ook nog een midi router bij met verschillende filters en effecten.
Sowieso het volgende:
- routen, splitten en samenvoegen van meerdere poorten
- interne midi clock naar alle poorten met instelbare deelfactor per poort
- externe midi clock naar alle poorten met beperkt instelbare deelfactor
- sysex backup en restore
- volca sync via de headphone uitgang(als ik dat voor elkaar kan krijgen)


Het programma komt voort uit een project voor Bome Midi Translator, aangezien ik daar tegen beperkingen aanliep heb ik besloten python te leren.
In eerste instantie is het gemaakt voor de Raspberry pi, maar ik ontwikkel het op Windows en technisch gezien zou het ook moeten werken op de Mac.
Er is ondersteuning voor alle class compliant usb-midi apparaten. Voor midi din poorten kun je een standaard usb-midi interface gebruiken.
Midi din is echter te langzaam voor gebruik van de Digitakt functies vanwege de grote hoeveelheid nrpn berichten. De digitakt moet dus aangesloten worden via usb.

Het wordt gratis met waarschijnlijk een optie voor donatie.
Alle optionele onderdelen voor dit project zullen standaard accessoires voor de Raspberry pi zijn waarbij je niet hoeft te solderen.
Er komt sowieso ondersteuning voor de Pimoroni Display-o-tron hat.

Waar ik nu naar op zoek ben is suggesties en ideeen van mensen met een Digitakt. Het is bedoelt voor zowel live als in de studio.
Daarnaast zijn ideeen voor de midi router ook alvast welkom.
Hou er wel rekening mee, ik programmeer pas een paar maanden, ik kan geen wonderen verrichten.

Ik ben vast nog een hoop vergeten en er zullen ongetwijfeld vragen zijn, dus schiet maar raak!
 
Leuk project als motivatie om te programmeren zou ik zeggen. Python is een van m'n favoriete talen, omdat je er erg snel al veel resultaat in kunt bereiken (en het voor vanalles en nogwat van toepassing kan zijn).

Ben benieuwd om te zien wat je hier uit bakt. En als je iets over python wil weten, vraag maar raak. (al snap ik zelf de ballen van windows of mac ..)
 
Ik ben ook erg blij met python, ik kon gewoon heel basic beginnen en hoe verder ik kom, hoe compacter en "slimmer" de code wordt.
Het moeilijke aan python vind ik wel de timing van alles. De sleep functie is niet betrouwbaar dus uiteindelijk moest ik best wel wat cpu opofferen om de midi-clock echt strak te krijgen.
De midi-clock gebruikt nu zo'n 15-20% cpu van de raspberry pi 3b.
Ik heb nu ook een low-cpu versie van de clock erbij, maar die heeft wel wat meer jitter. Als je daar een goede oplossing voor hebt zou dat erg van pas komen.
Een strak getimede low-cpu loop functie zegmaar.
 
Je wil zoiets echt niet met sleep() oplossen (dan block je namelijk de rest van je code). Een aparte thread met een Timer object biedt wellicht een oplossing: https://www.geeksforgeeks.org/timer-objects-python/
threading.Timer was helaas ook niet precies genoeg omdat het op de achtergrond nog steeds gebruik maakt van time.sleep.
Zoals ik het nu heb geimplementeerd is het een aparte thread met een zelf corrigerende loop gebaseerd op time.performance_counter. Het lijkt nu het meest de een call-waiting methode maar met een time.sleep(0) in de wait loop om de rest van de code een kans te geven.
Ik heb ook wel 20 verschillende manieren van timing geprobeert voordat ik uitkwam op de huidige implementatie.
Ik heb de afwijking geprobeerd te testen, maar na 8 bars is er geen afwijking te horen en ik had ff geen langere loop. Technisch gezien zou de clock zelfs na een maand nauwelijks afwijking moeten hebben.
Die 15-20% cpu geldt ook alleen voor de interne midi-clock, zodra die uitstaat doet het hele script hooguit een paar procent cpu.

Midi clock krijgt ook voorrang in de code bij binnenkomst, externe clock doorsturen werkt dus ook prima.

Als je echt iets goed wil maken moet je daar dus niet op gaan bezuinigen.
Komt goed steve, ik zal er verder niet op bezuinigen, de low-cpu variant blijft optioneel.
 
Ik heb net even de clock getest met een midi-dinkabel direct van de Digitone naar de Digitakt.
De waardes die de Digitakt daarbij laat zien zijn precies hetzelfde als bij mijn usb-midi clock.

Op 174 BPM zie ik waardes tussen 173.7 en 174.1, onder de 150 BPM zie ik voornamelijk meer exacte waarden, onder de 100 BPM zie ik eigenlijk alleen exacte waarden tot 0.1 nauwkeurig.

Kortom, beter dan dit gaat t niet worden, het blijft tenslotte midi.

De clock is nu instelbaar van 30 tot 300 BPM. Ik hoop dat dat ruim genoeg is voor de meeste mensen.
Als t nodig is kan die beperking d'r af, in principe is elk BPM mogelijk.
 
FF een korte update:

De interne midi clock heeft naast het tempo nu ook 8 dividers.
Elk van de dividers heeft een instelbare deelfactor die verwant is aan het tempo.
Je kunt elke midi output toewijzen aan de midi clock of aan 1 van de 8 dividers.

De midi router werkt ook, elk van de geselecteerde inputs krijgt een lijst met bestemmingen waar je outputs in kan zetten.

Het ontvangen van sysex en het opslaan in .syx bestanden is toegevoegd voor het maken en terugzetten van sysex backups.

De interface wordt nu aan gewerkt, maar biedt in ieder geval ondersteuning voor verschillende resoluties en daarmee bijna elk scherm.
De interface werkt met een toetsenbord, muis, joystick en uiteraard midi. Touch moet daar nog bij.

Song mode voor Digitakt en Digitone is bijna af.
Het bestaat uit een sequencer met 4 sporen, 2 Digitakts, 2 Digitones.
Elk van deze sporen gebruikt de clock divider die is toegewezen in de router, zo kan elk van de 4 apparaten op een ander gerelateerd tempo lopen.
Song mode heeft een bestandsformaat wat makkelijk uit te lezen is en met de hand aan te passen, of zelf te maken indien nodig.

Instellingen kunnen makkelijk worden opgeslagen en geladen.
Alle instellingen komen in een simpel tekstbestand wat ook makkelijk aan te passen is.

De hele code is enorm veel kleiner geworden, minder dan de helft voor veel functies.


De meeste achterliggende code is nu bijna klaar, het bouwen van een fatsoenlijke user interface kost helaas veel tijd.
Zodra de interface bruikbaar is zal ik de eerste versie online zetten.
 
Nog steeds mee bezig, maar sommige dingen waren iets lastiger dan gehoopt, voornamelijk de GUI.
Ondertussen is de code voor de GUI grotendeels compleet en heel erg geoptimaliseerd voor laag CPU verbruik.
Er is een aparte GUI voor Digitwins song mode en een zeer duidelijk menu voor alle instellingen.
Elk denkbaar beeldscherm is nu ondersteund, met alle gangbare resoluties instelbaar via het menu, zowel windowed als fullscreen.
Resoluties van 320 x 240 tot aan 4K. De laagste resoluties zijn downscaled voor beter beeld.

Ondersteuning voor kleurenthema's voor de hele GUI is aanwezig, een goed formaat voor eigen thema's komt nog.
Ik denk overigens niet dat het echt nodig is, het standaard thema is zeer duidelijk en zou ook moeten werken voor mensen met kleurenblindheid.
 
image_135233.jpg image_135234.jpg
 

Attachments

  • image_135235.jpg
    image_135235.jpg
    73,6 KB · Bekeken: 174
  • image_135236.jpg
    image_135236.jpg
    65 KB · Bekeken: 186
sow ja; interface lijkt op fasttracker :) (digitakt is beetje een tracker in een doosje zowiezo imo)
 
Eerlijkheid gebied mij te zeggen dat de interface schaamteloos gebaseerd is op FastTracker II:P:engel:
Sommige kleuren zijn zelfs bijna identiek.
Het is een beetje met een knipoog, want mijn programma is natuurlijk niet echt een tracker.

Ik was op zoek naar iets wat voor iedereen zou werken, en ik was altijd al gecharmeerd van het "Blue" thema van FastTracker.

Voor alle FastTracker fans die het voor de nostalgie nog eens wil draaien:
https://16-bits.org/ft2.php
Clone van FT2 die prima werkt op een moderne Windows.
 
Er zijn trouwens vorderingen:

De onderliggende code is wederom verbouwd omdat ik nog steeds aan het leren ben.
Alles zit nu netjes in classes en alle bestanden zijn netjes ingedeeld in mappen.
Het is nu eindelijk code waar een ander ook nog iets aan heeft.

De sequencer heeft nu vier tracks, puur voor Digitakt/Digitone. Dat worden er waarschijnlijk 12 of 16.

De tracks kunnen straks ook gebruikt worden voor elke synthesizer om program changes mee te automatiseren.

Er komt een gedeelte in voor midi-mappings op een logische manier, geen gedoe meer met CC's, scaling en verschillende soorten controls.
Er komt een losse editor bij voor het maken van mappings.

MPE voor Digitakt wordt aan gewerkt.
Portamento, Unison, Unison detune, Pitchbend, Modwheel, en Expression werken allemaal prima voor de Digitakt.
2 Parts tegelijk, je kunt zelf kiezen per pattern hoeveel Kanalen je daarvoor gebruikt en hoe ze gesplitst zijn.
Alle settings worden per pattern bewaard in de software die automatisch in sync loopt met de Digitakt.

Zodra MIDI 2.0 wordt toegevoegd aan rtmidi is er nog meer mogelijk, maar dat duurt waarschijnlijk nog ff.
 
De tracker is niet echt een tracker. Het is zoals je in de screenshots kunt zien "song mode" voor de Digitakt/Digitone.

Polyfonie voor de Digitakt gaat per pattern.
Je selecteerd hoeveel tracks je wilt stelen voor polyfonie en of/hoeveel daarvan naar part 2 gaan.
Het script wat erachter zit regelt de rest.

De kanalen die je selecteerd hebt zijn dan niet meer toegankelijk via de router, maar reageren nu als onderdeel van kanaal 1 en/of 2.
Vervolgens kun je voor die 2 parts een modus selecteren: Poly of Mono/Unison met alle bijbehorende settings zoals portamento.
Ook worden alle controls gemirrored, voorbeeld:
Je hebt bijvoorbeeld kanaal 1-4 op poly staan. Als je nu iets veranderd aan één van die kanalen op de Digitakt gaan de andere kanalen automatisch mee.
Stuur je via de router midi naar de Digitakt, dan reageren kanaal 1-4 allemaal op kanaal 1.
Je hebt dan ook de controle over de extra instellingen via midi cc op dat kanaal.

Voor alles zijn extra midi cc's.

Zeg maar net als de retrokits kabel maar dan usb, met song mode en op steroids:)
 
Back
Top