MIDI messages, objectified in Ruby
Pull request Compare This branch is even with gilesbowkett:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
examples
lib
test
.gitignore
LICENSE
README.rdoc
Rakefile

README.rdoc

MIDI Message

MIDI messages, objectified in Ruby

Features

  • Flexible API to accommodate various sources and destinations of MIDI data

  • Simple OO approach to System Exclusive data and devices

  • YAML dictionary of MIDI constants

Install

gem install midi-message

Usage

require 'midi-message'

include MIDIMessage

Basic Messages

There are a few ways to create a new MIDI message. Here are some examples

NoteOn.new(0, 64, 64)

NoteOn["E4"].new(0, 100)

with(:channel => 0, :velocity => 100) { |context| context.note_on("E4") }

Those expressions all evaluate to the same object

#<MIDIMessage::NoteOn:0x9c1c240
 @channel=0,
 @data=[64, 64],
 @name="E4",
 @note=64,
 @status=[9, 0],
 @velocity=64,
 @verbose_name="Note On: E4">

SysEx Messages

As with any kind of message, you can begin with raw data

SystemExclusive.new(0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7F, 0x00, 0x41, 0xF7)

Or in a more object oriented way

synth = SystemExclusive::Node.new(0x41, 0x42, :device_id => 0x10)

SystemExclusive::Command.new([0x40, 0x7F, 0x00], 0x00, :node => synth)

A Node represents a device that you're sending a message to (eg. your Yamaha DX7 is a Node). Sysex messages can either be a Command or Request

You can use the Node to instantiate a message

synth.command([0x40, 0x7F, 0x00], 0x00)

One way or another, you will wind up with a pair of objects like this

#<MIDIMessage::SystemExclusive::Command:0x9c1e57c
@address=[64, 0, 127],
@checksum=[65],
@data=[0],
@node=
 #<MIDIMessage::SystemExclusive::Node:0x9c1e5a4
  @device_id=16,
  @manufacturer=65,
  @model_id=66>>

Parsing

The parse method will take any valid message data and return the object representation

MIDIMessage.parse(0x90, 0x40, 0x40)

  #<MIDIMessage::NoteOn:0x9c1c240 ..>

MIDIMessage.parse(0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7F, 0x00, 0x41, 0xF7)

  #<MIDIMessage::SystemExclusive::Command:0x9c1e57c ..>

Check out nibbler for more advanced parsing

API Documentation

Author

License

Apache 2.0, See the file LICENSE

Copyright © 2011 Ari Russo