Midi vraagje

heiko

abc
Lid sinds
2 juli 2006
Berichten
533
Locatie
Amsterdam
Ik ben een MIDI interface aan het programmeren en heb een vraagje aan de MIDI gurus.

Als ik een MIDI stream heb kunnen system messages tussen de normale messages (bv Note On, Note Off, etc) gezet worden. Nu is de vraag of dit alleen geldt voor de System Real-Time messages (de 1 byte lange messages) of ook voor de System Common messages.

In code zou het er bv zo uit zien voor een normale system RT:
91 63 63 81 63 F8 00 (Dus zet note number 63 aan en uit op channel 1 met er tussen een midi clock)

Maar kan bv ook dit?
91 63 63 81 63 F2 10 10 00? (note 63 on op channel, song position pointer door de note off)

Het lijkt mij dat System Common messages niet tussen andere messages worden gestuurd maar wil graag zeker weten of dit zo is zodat mijn code full proof is...

Heiko
 
Interessante vraag. Ik ben geen MIDI expert, maar dit is wel iets wat mij interesseert. Ik heb dus zelf even zitten neuzen.

Ik lees het volgende:

Code:
System Common Category messages (ie, Status of 0xF0 to 0xF7) cancel any running
status. In other words, the message after a System Common message must begin with a
Status byte. System Common messages themselves can't be implemented with running
status. For example, if a Song Select message was sent immediately after another Song
Select, the second message would still need a Status byte.

Daarnaast:

Code:
The MIDI spec allows for a MIDI message to be sent without its Status byte (ie, just its
data bytes are sent)[B] as long as the previous, transmitted message had the same Status.
This is referred to as running status[/B].

Volgens mij is het onderstaande een geldige MIDI stream:

0x90 0x3C 0x7F 0xF2 0x00 0x00 0xF0 0x7E 0x7F 0x09 0x00 0xF7 0x90 0x48 0x3F 0x4A 0x3F

Opgesplitst:
0x90 -- volgende message is een 'note on' message
0x3C 0x7F -- C3, velocity 127
0xF2 0x00 0x00 -- zet song pointer op 0
0xF0 ... 0xF7 -- SysEx bericht
0x90 -- volgende message is een 'note on' message
0x48 0x3F -- C4, velocity 63
0x4A 0x3F -- D4, velocity 63

Je gebruikt zelf 91, maar is dat niet kanaal 2 ipv kanaal 1?

Niet de officiƫle MIDI spec, maar wel een stuk leesbaarder:
http://www.gweep.net/~prefect/eng/reference/protocol/midispec.html
 
Ik ben een MIDI interface aan het programmeren en heb een vraagje aan de MIDI gurus.

Als ik een MIDI stream heb kunnen system messages tussen de normale messages (bv Note On, Note Off, etc) gezet worden. Nu is de vraag of dit alleen geldt voor de System Real-Time messages (de 1 byte lange messages) of ook voor de System Common messages....
(MIDI gurus wat een naam zeg.)
De vraag is me nog niet 100% duidelijk. Onder welk OS programmeer je die MIDI interface ?
Waar komen die twee coderegels vandaan ?

Mixen van de messages kan zolang je maar voldoende tijd geeft zodat elke message op zich afgewerkt kan worden, zowel door sender als reciever. Denk maar aan de checksums en bytecounts voor sysexdata. Verder mag je de status van een commando niet veranderen tijdens het verzenden tenzij afbreken (bvb. sysexbulkdump).

@mjbrands 'Je gebruikt zelf 91, maar is dat niet kanaal 2 ipv kanaal 1?'
Inderdaad en 90 is kanaal 1.
 
Laatst gewijzigd:
Midi vraag

Midi vraag

@mjbrands: ik ken de handleiding die je aan haalt. Omdat het nog niet 100% duidelijk was heb ik deze vraag gesteld. De code wordt een aardig stuk lastiger als System Common messages tussen Voice messages gezet worden (dan moeten er stacks gemaakt worden etc.).
Ik heb er nog wat meer over gedacht en kom tot de conclusie dat de system realtime messages de enige messages zijn die tussen voice messages gezet kunnen worden. Daarom zijn ze waarschijnlijk ook slechts 1 byte lang. Als ze 2 of 3 bytes lang zijn dan wordt de code zoals gezegd moeilijker.

@audiocollage: ik snap niet helemaal waarom het OS belangrijk zou zijn? Ik programmeer voor een embedded system en dus in een microcontroller. De functie is in zijn geheel geschreven in C...

Weten jullie trouwens nog een bron waar ik kan vinden wat de rare truukjes zijn in MIDI. Een voorbeeld is bv dat je ook een Note Off kan maken door een Note On te geven met velocity 0x00. Of het tempo wieltje op mijn Korg Microkontrol dat een Midi Stop message geeft als het tempo te laag gedraaid wordt. Een overzicht van dit soort gedrag zou erg handig zijn om de code te laten werken met zoveel mogelijk instrumenten...

Heiko
 
Die kunnen er niet tussendoor komen.

Bijgevoegd mijn implementatie. Zit wat rommel tussendoor - in midi/alsa_raw_midi_input.cc staat de parser voor raw MIDI. Doe er je voordeel mee:)
 

Attachments

  • midi-example.zip
    43,9 KB · Bekeken: 75
Weten jullie trouwens nog een bron waar ik kan vinden wat de rare truukjes zijn in MIDI. Een voorbeeld is bv dat je ook een Note Off kan maken door een Note On te geven met velocity 0x00. Of het tempo wieltje op mijn Korg Microkontrol dat een Midi Stop message geeft als het tempo te laag gedraaid wordt. Een overzicht van dit soort gedrag zou erg handig zijn om de code te laten werken met zoveel mogelijk instrumenten...

Heiko

Dat Note On/Off verhaal staat gewoon in de spec en in de beschrijving die iemand hierboven al linkte. Wat de Korg Microkontrol doet heb ik nog niet eerder gezien. Een overzicht zou ik ook zeer kunnen waarderen, maar ik heb zoiets nog nooit gezien. Beste kans maak je nog in de source van open source sequencers enzo, denk ik.
 
...@audiocollage: ik snap niet helemaal waarom het OS belangrijk zou zijn? Ik programmeer voor een embedded system en dus in een microcontroller. De functie is in zijn geheel geschreven in C...
Ik vermoedde al zoiets. Met de MS api's kan je zo'n code '91 63 63 81 63 F8 00' niet uitsturen, ontvangen is ook al een vraag.
Dus toch uitzien waarmee je je embedded system wil laten samenwerken.
Wat wordt het trouwens ?
(heiko heeft dat iets met Haiku ... Beos ?)
Weten jullie trouwens nog een bron waar ik kan vinden wat de rare truukjes zijn in MIDI..
Rare truukjes ... overzicht ?
Weet ik niet, bedenk maar wat :
Note Off Velocity >0 converteerbaar naar Note On Velocity 0.
Correcte verwerking van Active Sensing (Yamaha standaard gebruik).

Verder mogelijk hier : http://www.midi.org/techspecs/midimessages.php
 
Bedankt voor de antwoorden weer. Ik eens door je source kijken zmooc.
Er is trouwens een redelijke kans dat ik een Application Note krijg bij de microcontrollerfabrikant hier zal een werkende Midi Message Aggregator in staan met een stuk achtergrond voor mensen die met MIDI willen programmeren in C. Ik laat het dan wel weten!

@audiocollage: ik ben bezig om een speciaal soort Midi/CV converter te maken. Vanwege het feit dat C zo portable is, wil ik dat mijn code zo waterdicht mogelijk is zodat ik deze kan recyclen op andere platforms.
En het feit dat MS een check heeft ingebouwd om illegale streams te onderdrukken betekent mijns insziens nog niet dat andere mensen dit ook hebben gedaan. Ik gooi altijd een enorme garbage file over mijn code heen om te zien of de code blijft functioneren. Een soort van 'black page' zoals Frank Zappa zijn drummers testte ;)
 
...
En het feit dat MS een check heeft ingebouwd om illegale streams te onderdrukken betekent mijns insziens nog niet dat andere mensen dit ook hebben gedaan.
t' is effe chatten...
Ja/nee veel programma's gebruiken de api's van MS wel (ongeacht de programmeertaal). Uiteindelijk dient externe hardware daar dan toch mee overweg te kunnen.
 
midi code

midi code

Hey Zmooc,

Bedankt voor je C++ code. Ik ben er even doorheen gelopen en het meeste is goed te lezen met mijn kennis van C. Wat mij wel opviel is dat de ALSA code volgens mij de MIDI data polled... Of wordt hier toch ergens een interrupt en ISR om de code af te vangen?

Ook zag ik dat je de pitchwheel data in een stuk van 14bit aaneenrijgt (concatenate) is dat nodig?

En de code is nog niet helemaal af. Weet jij of er al volledigere versies zijn van de code. Ik zou graag willen zien met wat voor rare MIDI regeltjes rekening gehouden moet worden...

Heiko
 
Virtual Midi Port

Virtual Midi Port

@zmooc: en als je nog een voorbeeld nodig hebt van een virtual midi test poort dan kan ik die code nog wel delen.

Ik had op mijn vakantie geen MIDI keyboard bij me en heb een code geschreven die MIDI data via een UART loopback dumpt naar de MIDI IN. Dit werkt echt superhandig omdat je compleet gecontroleerd kan zien hoe MIDI messages en streams afgehandeld worden. (= dus een debugpoort). De poort kost weinig code en een kleine array die de MIDI streamdata bevat.

Heiko
 
...Ook zag ik dat je de pitchwheel data in een stuk van 14bit aaneenrijgt (concatenate) is dat nodig?
Pitchwheel data benodigd standaard twee bytes (16 bits) dus dat lijkt me redelijk logisch. Maar bijna al de rest wordt daar ook verwerkt met twee bytes ineens (na de status) ?
N.m.i. veel logischer dan die twee coderegels bovenaan waarin je de standaard volgorde laat onderbreken.
Als je zoiets toelaat, wat dan met : '91 63 63 81 63 F2 00 10 10' velocity 0 na de eerste byte van de song position pointer.
(Ok, minder logisch in praktische zin, maar...)
 
Laatst gewijzigd:
@audiocollage: het is voor mij nu wel duidelijk dat een Sys Common niet door een normale stream geperst wordt. Dat is alleen voor Sys RealTime (F8 tm FF) geldt dat ze door een andere message geperst kunnen worden.
Voor System Common geldt dat ze altijd in zijn geheel worden verzonden nadat de andere message verzonden is. Dus 91 63 40 F2 10 10 81 63 00 kan wel maar 91 63 F2 10 10 81 63 00 kan niet. En bij deze stream geldt dat na elke message de Instrument Status gereset wordt.

Het aan elkaar rijgen van de pitchwheel values klopt idd:

Two data bytes follow the status. The two bytes should be combined together to form a 14-bit value. The first data byte's bits 0 to 6 are bits 0 to 6 of the 14-bit value. The second data byte's bits 0 to 6 are really bits 7 to 13 of the 14-bit value. In other words, assuming that a C program has the first byte in the variable First and the second data byte in the variable Second, here's how to combine them into a 14-bit value (actually 16-bit since most computer CPUs deal with 16-bit, not 14-bit, integers):

unsigned short CombineBytes(unsigned char First, unsigned char Second)
{
unsigned short _14bit;

_14bit = (unsigned short)Second;
_14bit<<=7;
_14bit|=(unsigned short)First;
return(_14bit);
}

Het is dus gewoon een kwestie van 7 left shifts en de 14 bit value is gemaakt.


Heb ik nog een vraagje:
De multi-channel converter die ik maak heeft een heel brede output range (+/-10V) zodat ik ongeveer elke synth kan aansturen. Een probleem is alleen dat je voor elke specifieke synth de output range moet instellen. 9V zou bij 1 synth al volledig een VCF kunnen open zetten terwijl een andere synth daar 10V voor nodig heeft.
Nou zou ik in mijn converter een SysEx functie kunnen bouwen waarmee de gebruiker ten eerste een map kan loaden maar ook de minimale, maximale waardes kan programmeren en eventueel de slope van de curve (linear, sigmoidal, exp., etc). Maar het lijkt me veel gehannes als dit gewoon zou kunnen in een DAW door de min/max setting van de virtual encoder/slider in te regelen. Weten jullie of dit in de meeste DAWs kan?

Heiko
 
uitzonderings channel mode messages

uitzonderings channel mode messages

Ik heb een aantal 'aparte' CC messages gevonden (staan in principe allemaal in het document van gweep.net) maar het leek me handig voor andere mensen die ook midi functies zelf programmeren om een overzichtje te hebben, want een volledige midi code moet op deze functies reageren.

Controller# value funktie
120 0 all sounds off
121 0 reset all controllers
122 0/127 local control (0 = external control, 127 = local control)
123 0 all notes off
124 0 omni mode off
125 0 omni mode on
126 M monomode on, poly off (M is number of midi channels)
127 0 poly on, mono off (upon reception of 127 all playing notes are turned off)

Heiko
 
...Heb ik nog een vraagje:
De multi-channel converter die ik maak heeft een heel brede output range (+/-10V) zodat ik ongeveer elke synth kan aansturen. Een probleem is alleen dat je voor elke specifieke synth de output range moet instellen. 9V zou bij 1 synth al volledig een VCF kunnen open zetten terwijl een andere synth daar 10V voor nodig heeft.
Nou zou ik in mijn converter een SysEx functie kunnen bouwen waarmee de gebruiker ten eerste een map kan loaden maar ook de minimale, maximale waardes kan programmeren en eventueel de slope van de curve (linear, sigmoidal, exp., etc). Maar het lijkt me veel gehannes als dit gewoon zou kunnen in een DAW door de min/max setting van de virtual encoder/slider in te regelen. Weten jullie of dit in de meeste DAWs kan?

Heiko
+/-10V is dat ongeveer of van + naar - 10 volt => 20 volt geeft 20 octaven. Wie hoort dat ? Welke synth gebruikt dat ?
Volgens de Moog standaard werken synths met een 1V per octaaf behalve de Moog synths zelf :D. Daarom hou je beter die standaard voor ogen met nog een kleine marge (voor de Moogs dan).
Betreft die map, veel DAW gebruikers kunnen daar moeilijk mee overweg. Bovendien werken die met midi-waarden voor het extern-aansturen van knoppen enzo. Logic kan, binnen de midi-norm, alle mappen verwerken/maken die je wil andere DAW's ken ik niet zo. (Zelfs ik, krijg al de indruk dat het een ingewikkeld apparaat wordt... ;)
Die CC tabel bestaat al wat jaartjes hoor (30 ?).
 
converter

converter

@audiocollage: bedankt voor je input. Over een paar maanden zal ik bekend maken wat de converter allemaal precies bezielt en dan zal alles duidelijk worden :D
 
Back
Top