[gst-devel] MIDI in Gstreamer
Stefan Kost
ensonic at hora-obscura.de
Wed Apr 20 00:03:17 CEST 2005
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