[gst-devel] MIDI in Gstreamer

Andrew "Silver Blade" Greenwood lists at silverblade.co.uk
Wed Apr 20 02:52:54 CEST 2005

I'd be interested in there being some MIDI plugins. In fact, I believe 
some commercial audio/MIDI apps already do this.

Is there no way to bundle MIDI into a continuous stream and have plugins 
read MIDI data from it? May seem like a stupid suggestion but I'm not 
really sure how it'd work.

The problem with using a controller-value-to-Gstreamer-event approach is 
that I don't think you'd "see" the connection between the elements. By 
that I mean a controller pad wouldn't connect directly to another 
controller pad, I think? Or am I wrong?

Maybe the element receiving controller values could set its own params?

I noticed from the mailing list archive that people appeared to be a 
little scared of /dev/midi - I took this as a bad thing, but upon 
researching, it's almost identical (if not easier to use) than the 
Windows MM system. Just fire MIDI data at it and it works. ALSA provides 
a few advanced features that some developers might want, however, but 
it'd be a case of translating MIDI events into ALSA events, which would 
then be translated back into MIDI events again.

Orrrrr... We could have a separate pad type for ALSA... Which would 
provide advanced functionality, but at the cost of sacrificing pure MIDI 

Stefan Kost wrote:

> Hi Andrew,
> for me the question is, does anyone wants to write plugins that 
> process midi data, such as a midi echo. If so we need midi as a stream 
> format. The difficulty here is that there is not a lot of code that 
> handles sparse streams. GStreamer is fine handling mostly continous 
> data, like audio and video.
> Personally I think playing midi or tracker music is more like setting 
> up sound-generators and effect, wire them and connect to a sound-sink. 
> Further set up GstControllers to the element properties that push in 
> the control changes from the tracks at the right time.
>> Hi all, I'm new to Gstreamer, so if I ask something completely 
>> stupid, be gentle ;)
>> Seems like MIDI has been ignored for the most part with Gstreamer. 
>> I've been shown a document detailing discussions so far regarding 
>> MIDI in Gstreamer, and my initial ideas appear to coincide with those 
>> already suggested, which is good.
>> I'm interested in implementing MIDI as:
>> 1) I'm writing a program which will use MIDI and audio extensively
>> 2) My own routing API - which I've given up to use Gstreamer instead 
>> - was going to deal with MIDI
>> 3) I've worked with MIDI for quite a while so know the standard 
>> fairly extensively
>> I'm also interested in implementing a "CV" (Reason-speak... Control 
>> Voltage/Value?) pad/data type, for the purpose of sending timestamped 
>> controller values between elements. This is useful for example in the 
>> case where you might want one element to generate values going from 
>> 0.0 to 1.0 and back, and use those values in another element to 
>> control volume/panning, etc. This would look something like this:
>> Generator Output Pad -> Effect Input Pad
>> (Where both pads are in CV/controllervalue/controlvalue/whatever format)
>> This isn't essential, but it'd be useful for my app, and I imagine 
>> maybe other apps too. It might be possible to sit this on top of the 
>> MIDI protocol, using one of the general purpose or "effect" 
>> controllers which aren't assigned to a specific function. Or even 
>> have elements generate events/parameter changes occurring in other 
>> elements. I'm not too sure of this though.
>> So we need formats. audio/midi might not be suitable, due to audio/* 
>> having channel and rate properties - MIDI doesn't really have these. 
>> Also we need one for the MIDI file format (I assume?) and one for the 
>> MIDI stream. Any suggestions?
>> My main purpose for writing this message though is to get an idea 
>> what people want from MIDI.
>> For those of you unfamiliar with MIDI, the format generally goes 
>> something like this:
>> Status Byte - Data 1 - Data 2
>> Tack a timestamp on the start of that and you have a MIDI event 
>> stream, I guess.
>> Status Byte is always 0x80 or higher - this is to enable MIDI devices 
>> to just spit out the data bytes, and the last status byte will be 
>> assumed. Thus all data bytes must be under 0x80.
>> Status bytes between 0x80 and 0xEF have the low 4 bits used to 
>> indicate which channel the message refers to (0x80 - channel 1, 0x81 
>> - channel 2 ... up to 16)
>> Status bytes 0xF0 and above are system messages and not 
>> channel-dependent. I'll not go into detail about these at the moment.
>> Currently, I have ideas for the following elements:
>> SMF_IN - Standard MIDI File input - takes a filesrc (or other input?) 
>> and provides a stream of MIDI events
>> SMF_OUT - same as above, but takes MIDI events and spits out a MIDI file
>> MIDI_IN - Hardware MIDI input - provides a stream of MIDI events from 
>> a device
>> MIDI_OUT - same as above, for output
>> MIDI_SPLIT - take 1 MIDI input - provide N MIDI outputs (repeats the 
>> same stream N times)
>> MIDI_MERGE - take N MIDI inputs - provide 1 MIDI output (to join 
>> multiple MIDI streams)
>> MIDI_DEMUXER - take 1 MIDI input - provide 17 MIDI outputs (1 for 
>> each channel, and 1 for system messages)
>> MIDI_MUXER - take 17 MIDI inputs (as above) - provide 1 MIDI output
>> MIDI_MESSAGE_FILTER - take 1 MIDI input - provide 7 MIDI outputs - 
>> spits out messagse on each pad depending on the category (note 
>> on/off, controller value change, patch/program select, etc.)
>> MIDI_SYSEX_FILTER - take 1 MIDI input - provide 1 MIDI output - 
>> removes messages between 0xF0 and 0xF7 (not really useful messages 
>> unless doing advanced things like dumping hardware equipment 
>> configurations etc.)
>> There's probably oh-so-much more that can be done with this, but 
>> those are my initial ideas - mainly for the purpose of manipulating 
>> MIDI messages so that they can be routed as you wish really.
>> Another possible element would be one that takes a MIDI input and 
>> provides an output where all the messages refer to a specific 
>> channel. This isn't really necessary as long as elements that deal 
>> with one channel only ignore the low 4 bits of each message...
> Having windows sinks and source for audio and video would be nice. It 
> just not yet be done. We are still waiting for takers ;)
>> Also, as a side-note, has anyone considered implementing elements to 
>> make use of PortAudio / PortMIDI? This might make Gstreamer a bit 
>> more portable as I'd love to use it for Windows stuff as well as 
>> Linux. Just a thought as it might help cut a few corners...
>> -Andrew
> Stefan

More information about the gstreamer-devel mailing list