midifile.rb is a small library script for Ruby that provides facilities for reading and writing standard midifiles. It lets you use very simple code to read a midifile, breaking it out into elements (headers and events) in convenient form for further processing. It reads directly from the file, without storing it all in memory first. New files can be created as well, usually by building an object in memory, adding elements as desired, and writing the complete sequence to a file at the end. 'Generator' methods are supplied for easy creation of most kinds of events. Simple alterations (such as transposing all the notes) can actually be done without building a new object — elements can be written out immediately they are read from the input. This release fixes (further!) the rather lamebrained sorting of events done by previous versions. 'Simultaneous' events no longer get shuffled, and the occasional mistiming of the last note is fixed. It is also no longer stupidly slow. Some minor new hooks have been added to help with handling MIDI streams as well as files (Previously) New 'channel' accessor methods were added to the MidiItem class that work with 'user' numbering (1..16) rather than the internal 0..15 range of the 'chan' attribute, which should make it easier to avoid confusion. There is a major change [ugghh!] to Ruby version 1.9 that prevented an earlier midifile.rb working as supplied — fixed as of 2010 August 29. See below for details. (The GMsummary example also needed a minor update for 1.9.) The code places few restrictions on the user. It will read and write both Format 0 and Format 1 (even Format 2...) files. It is intended to be minimal yet flexible. (Which means probably that you could generate an invalid file fairly easily, but it is straightforward enough that you should be able to avoid this.) As a taster, here is an absolutely trivial lister for "myfile.mid" (using the basic 'to_s' methods provided): require 'midifile.rb' open("myfile.mid", "r") {|f| mf = Midifile.new(f) mf.each {|elem| puts elem } } |
The downloadable archives below contain the following:
|
Downloads:You can download the package here:midifile_rb.tgz — gzipped tar, 21 KBmidifile_rb.zip — zip archive, 31 KB |
Ruby 1.9 ProblemsI was notified (thanks Thomas!) that the midifile.rb written for 1.8 failed in Ruby 1.9. This was caused by a major -- and barely documented [and please note my displeasure...] -- change of philosophy in that version of Ruby. The midifile.rb module has now been updated to take account of this, and works under both 1.8 and 1.9, as well as with Ruby 2.x. |
Note to Windows UsersRemember that Windows thinks every file is text by default... Midifiles are binary, so you need to edit the scripts to make them work properly. (This is mentioned in the README, but is probably worth emphasizing!) All "open(somefilename")" lines must be changed to "open(somefilename, "rb")". |
Pete Goodeve Berkeley, California e-mail: pete@GoodeveCa.NET pete.goodeve@computer.org