Sans block
In addition to how I worked in the other examples, MicroMIDI can be used outside of the context of a Ruby block. This allows you to integrate it as a more conventional Ruby library.
Here is the first example from this post redone without a block
@o = UniMIDI::Output.use(:first)
midi = MIDI::IO.new(@o)
midi.note("C")
midi.off
midi.cc(5, 120)
midi.play("C3", 0.5)
Note that you can also re-open the IO object in a block later using the edit method
midi.edit do play "G3", 1 endPerformance Shortcuts
There are also performance shortcuts that generate messages based on past messages or common conventions.
- off - this generates a note-off message based on the last note-on message created
- quiet! - sends note-off messages to all MIDI channels on all outputs
- repeat - generates a copy of the last message created
Super Sticky Mode
Again in this post, I explained how MicroMIDI uses sticky values. There is also a super sticky mode that allows you to change the values inline with each message you create. Here's an example:
MIDI.using(@o) do super_sticky channel 1 note "C4" off octave 5 velocity 60 note "E", :channel => 2 off note "C3" off end
When this program is run, these messages are sent to @o:
* note C4 (channel 1, vel 100)
* note-off C4 (channel 1, vel 100)
* note E5 (channel 2, vel 60)
* note-off E5 (channel 2, vel 60)
* note C3 (channel 2, vel 60)
* note-off C3 (channel 2, vel 60)
As you can see, when I sent :channel => 2 to the second note command, the MIDI channel remained for the commands that followed rather than just being transient for that command.
Message Cache
MicroMIDI keeps a timestamped log of the messages you create. You can access this log using the cache command, like this:
M do note "C4" cc 5, 120 play "C2", 3 puts cache endThis code gives you this output:
{ :message=>#<MIDIMessage::NoteOn:0x007fbb6092baf8
@const=#<MIDIMessage::Constant:0x007fbb60930eb8 @key="C4", @value=60>,
@status=[9, 0],
@data=[60, 100],
@channel=0,
@note=60,
@velocity=100,
@name="C4",
@verbose_name="Note On: C4">,
:timestamp=>2.513885498046875
}
{ :message=>#<MIDIMessage::ControlChange:0x007fbb60924e10
@const=#<MIDIMessage::Constant:0x007fbb6093df00 @key="Portamento Time", @value=5>,
@status=[11, 0],
@data=[5, 120],
@channel=0, @index=5,
@value=120,
@name="Portamento Time",
@verbose_name="Control Change: Portamento Time">,
:timestamp=>2.7201175689697266 }
{ :message=>#<MIDIMessage::NoteOn:0x007fbb60921558
@const=#<MIDIMessage::Constant:0x007fbb60931f48 @key="C2", @value=36>,
@status=[9, 0],
@data=[36, 100],
@channel=0,
@note=36,
@velocity=100,
@name="C2",
@verbose_name="Note On: C2">,
:timestamp=>2.961874008178711
}
{ :message=>#<MIDIMessage::NoteOff:0x007fbb60917c38
@const=#<MIDIMessage::Constant:0x007fbb60931f48 @key="C2", @value=36>,
@status=[8, 0],
@data=[36, 100],
@channel=0,
@note=36,
@velocity=100,
@name="C2",
@verbose_name="Note Off: C2">,
:timestamp=>3003.7591457366943
}
http://github.com/arirusso/micromidi
No comments:
Post a Comment