midilib 2.0.2 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ChangeLog +2 -1
- data/Credits +44 -2
- data/README.rdoc +42 -33
- data/Rakefile +36 -53
- data/TODO.rdoc +13 -2
- data/examples/from_scratch.rb +4 -6
- data/examples/measures_mbt.rb +11 -11
- data/examples/print_program_changes.rb +11 -11
- data/examples/reader2text.rb +191 -190
- data/examples/seq2text.rb +18 -18
- data/examples/split.rb +21 -20
- data/examples/strings.rb +15 -15
- data/examples/transpose.rb +41 -42
- data/install.rb +53 -34
- data/lib/midilib/consts.rb +406 -408
- data/lib/midilib/event.rb +335 -306
- data/lib/midilib/info.rb +5 -7
- data/lib/midilib/io/midifile.rb +424 -452
- data/lib/midilib/io/seqreader.rb +187 -192
- data/lib/midilib/io/seqwriter.rb +151 -147
- data/lib/midilib/measure.rb +78 -80
- data/lib/midilib/mergesort.rb +39 -0
- data/lib/midilib/sequence.rb +99 -86
- data/lib/midilib/track.rb +71 -118
- data/lib/midilib/utils.rb +17 -20
- data/lib/midilib.rb +5 -5
- data/test/event_equality.rb +50 -52
- data/test/test_event.rb +120 -124
- data/test/test_io.rb +107 -40
- data/test/test_mergesort.rb +37 -0
- data/test/test_midifile.rb +6 -19
- data/test/test_sequence.rb +64 -52
- data/test/test_track.rb +126 -155
- data/test/test_varlen.rb +23 -27
- metadata +20 -22
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c7b4ef36d4f1d38a6f2c2bbf00fc34e7400822ab5f3f05242296bb383bf7cd35
|
4
|
+
data.tar.gz: e814f94bccbf648fb8ef7035551996673f6991114000ca7c7199c26cdee0d913
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9942744aebb170da22efff3c845f9b976f473c6b1584f00abf7da4b680c730eeb597a0aff8fc45b32c965453283a6cb007172183284d9f6116ff89c31dfb57d
|
7
|
+
data.tar.gz: 588a781e7776ca3adf309ba1a1eb6b4668c1767927e832c05963c31c85bacd0aee11b68df6e5d930dae7911b5fca663c48806c90ff8e8f53ecd139aa3753db50
|
data/ChangeLog
CHANGED
data/Credits
CHANGED
@@ -29,7 +29,7 @@ Jari Williamsson <jari.williamsson@mailbox.swipnet.se>
|
|
29
29
|
Noah Thorp
|
30
30
|
|
31
31
|
Found a bug in the code intended to make midilib work under Ruby 1.9.
|
32
|
-
Found another bug in
|
32
|
+
Found another bug in KeySig.data_as_bytes.
|
33
33
|
|
34
34
|
Zach Chadwick (zachad on Github)
|
35
35
|
|
@@ -48,4 +48,46 @@ Shai Rosenfeld (shaiguitar on Github)
|
|
48
48
|
J (dark-panda on Github)
|
49
49
|
|
50
50
|
Instead of monkeypatching ::Array, put sorting methods into new
|
51
|
-
MIDI::Array subclass to avoid clashes with Rails
|
51
|
+
MIDI::Array subclass to avoid clashes with Rails apps.
|
52
|
+
|
53
|
+
Lucas lfzawacki (lfzawacki on Github)
|
54
|
+
|
55
|
+
Found a bug in the MIDI::IO::SeqReader class: the pitch_bend method's
|
56
|
+
msb and lsb parameters were reversed.
|
57
|
+
|
58
|
+
Parki <parki06780678@gmail.com>
|
59
|
+
|
60
|
+
Reported failure of install.rb with newer versions of Ruby due to use of
|
61
|
+
old 'ftools' standard library component.
|
62
|
+
|
63
|
+
Adam Murray (adamjmurray on Github)
|
64
|
+
|
65
|
+
Submitted a patch that avoids writing empty data when writing tracks.
|
66
|
+
|
67
|
+
@dylee on Github
|
68
|
+
|
69
|
+
Submitted a patch that improves key signature event code and to_s.
|
70
|
+
|
71
|
+
@willm on Github
|
72
|
+
|
73
|
+
Suggested that Sequence.length_to_delta round the result instead of
|
74
|
+
truncating it.
|
75
|
+
|
76
|
+
@kaorukobo on Github
|
77
|
+
|
78
|
+
Fixed a bug where the delta offset of META_SEQ_NAME and META_COPYRIGHT
|
79
|
+
events were incorrectly always set to 0. The delta time may be any
|
80
|
+
value (although META_COPYRIGHT should normally be 0).
|
81
|
+
|
82
|
+
@rhelsing on Github
|
83
|
+
|
84
|
+
Added the ability to save MIDI format 0 files.
|
85
|
+
|
86
|
+
Miika Alonen (@amiika on Github)
|
87
|
+
|
88
|
+
Updated midilib for Ruby 2.7 and 3.0 by using blocks instead of Proc
|
89
|
+
objects and changing require to require_relative where appropriate.
|
90
|
+
|
91
|
+
@johnkolen on Github
|
92
|
+
|
93
|
+
Pointed out incorrect values for CC_GEN_PURPOSE_{5,6,7,8}.
|
data/README.rdoc
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
= midilib
|
2
2
|
|
3
3
|
midilib is a pure Ruby MIDI library useful for reading and writing standard
|
4
|
-
MIDI files and manipulating MIDI event data.
|
5
|
-
MIDI::Track, MIDI::Event, and MIDI::IO::MIDIFile and its subclasses
|
6
|
-
MIDI::IO::SeqReader and MIDI::IO::SeqWriter.
|
4
|
+
MIDI files and manipulating MIDI event data.
|
7
5
|
|
8
6
|
The GitHub project page and Web site of midilib is
|
9
7
|
http://github.com/jimm/midilib and the RubyGems.org page is
|
10
8
|
http://rubygems.org/gems/midilib, where you can also find all the RDoc
|
11
9
|
documentation.
|
12
10
|
|
13
|
-
midilib is compatible with
|
11
|
+
midilib is compatible with Ruby 2.6 and higher.
|
14
12
|
|
15
13
|
|
16
14
|
== Dependencies
|
@@ -31,11 +29,10 @@ which requires Rake (http://rake.rubyforge.org).
|
|
31
29
|
To install midilib as a gem, type
|
32
30
|
|
33
31
|
% gem install midilib
|
34
|
-
or
|
32
|
+
or, if you already have a previous version, use
|
35
33
|
% gem update midilib
|
36
34
|
|
37
|
-
|
38
|
-
install or update the gem.
|
35
|
+
You may need root privileges to install or update the gem.
|
39
36
|
|
40
37
|
=== Manual Installation
|
41
38
|
|
@@ -58,10 +55,9 @@ runs all of the tests in the test directory.
|
|
58
55
|
|
59
56
|
== Overview
|
60
57
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
file).
|
58
|
+
midilib can read and write MIDI file formats 0 (one single track) or 1
|
59
|
+
multiple tracks. By default, it writes format 1 which is the most common
|
60
|
+
format. MIDI file format 2 is not yet supported.
|
65
61
|
|
66
62
|
=== MIDI::Sequence
|
67
63
|
|
@@ -293,10 +289,10 @@ information. Though the first edition book is available online, I encourage
|
|
293
289
|
you to purchase a copy of the latest edition.
|
294
290
|
|
295
291
|
A description of the MIDI file format can be found in a few places such as
|
296
|
-
|
292
|
+
https://www.csie.ntu.edu.tw/~r92092/ref/midi/.
|
297
293
|
|
298
|
-
The MIDI message reference at http://www.
|
299
|
-
the format of MIDI commands.
|
294
|
+
The MIDI message reference at http://www.jimmenard.com/midi_ref.html
|
295
|
+
describes the format of MIDI commands.
|
300
296
|
|
301
297
|
|
302
298
|
= To Do
|
@@ -317,7 +313,7 @@ the format of MIDI commands.
|
|
317
313
|
= Administrivia
|
318
314
|
|
319
315
|
Author:: Jim Menard (mailto:jim@jimmenard.com)
|
320
|
-
Copyright:: Copyright (c) 2003-
|
316
|
+
Copyright:: Copyright (c) 2003-2013 Jim Menard
|
321
317
|
License:: Distributed under the same license as Ruby.
|
322
318
|
|
323
319
|
|
@@ -330,16 +326,29 @@ http://www.ruby-lang.org/en/LICENSE.txt.
|
|
330
326
|
midilib may be freely copied in its entirety providing this notice, all
|
331
327
|
source code, all documentation, and all other files are included.
|
332
328
|
|
333
|
-
midilib is Copyright (c) 2003-
|
329
|
+
midilib is Copyright (c) 2003-2013 by Jim Menard.
|
334
330
|
|
335
331
|
The song "No Fences" contained in the MIDI file examples/NoFences.mid is
|
336
332
|
Copyright (c) 1992 by Jim Menard (jim@jimmenard.com). It may be freely used
|
337
333
|
for non-commercial purposes as long as the author is given credit.
|
338
334
|
|
339
335
|
|
340
|
-
|
336
|
+
== Recent Changes
|
341
337
|
|
342
|
-
|
338
|
+
=== Changes for 2.0.5:
|
339
|
+
|
340
|
+
Updated +install.rb+ to work with newer versions of Ruby by using
|
341
|
+
+fileutils+ instead of +ftools+.
|
342
|
+
|
343
|
+
=== Changes for 2.0.3:
|
344
|
+
|
345
|
+
New MIDI::Sequence.pulses_to_seconds method.
|
346
|
+
|
347
|
+
=== Changes for 2.0.2:
|
348
|
+
|
349
|
+
Stop monkeypatching Array in MIDI::Track.
|
350
|
+
|
351
|
+
=== Changes for 2.0.0:
|
343
352
|
|
344
353
|
MIDI::NoteOnEvent and MIDI::NoteOffEvent renamed to MIDI::NoteOn and
|
345
354
|
MIDI::NoteOff. The old names will still work for a while.
|
@@ -368,51 +377,51 @@ recalc_delta_from_times sorts the events before doing anything else.
|
|
368
377
|
|
369
378
|
MIDI::Tempo#mpq_to_bpm now returns a float.
|
370
379
|
|
371
|
-
|
380
|
+
=== Changes for 1.2.0:
|
372
381
|
|
373
382
|
Use byte arrays instead of strings for passing around data. All tests now pass
|
374
383
|
for both Ruby 1.8.X and 1.9.X.
|
375
384
|
|
376
|
-
|
385
|
+
=== New code repository
|
377
386
|
|
378
387
|
The midilib code is now hosted at Github (http://github.com/jimm/midilib).
|
379
388
|
|
380
|
-
|
389
|
+
=== Changes for 1.1.4:
|
381
390
|
|
382
391
|
* Fixed a bug in KeySig.data_as_bytes. Thanks to Noah Thorp for finding this
|
383
392
|
and the bug fixed in 1.1.3.
|
384
393
|
|
385
|
-
|
394
|
+
=== Changes for 1.1.3:
|
386
395
|
|
387
396
|
* Fixed the way midilib detects the behavior of IO.getc.
|
388
397
|
|
389
|
-
|
398
|
+
=== Changes for 1.1.2:
|
390
399
|
|
391
400
|
* Define MIDI::IO::MIDIFile.getc differently for different Ruby versions,
|
392
401
|
instead of checking for String.bytes every time we read a byte.
|
393
402
|
|
394
|
-
|
403
|
+
=== Changes for 1.1.1:
|
395
404
|
|
396
405
|
* Make MIDI::IO::MIDIFile.getc do the right thing for both Ruby 1.8 and 1.9.
|
397
406
|
|
398
|
-
|
407
|
+
=== Changes for 1.1.0:
|
399
408
|
|
400
409
|
* Added test/test.mid to list of files to be included when packaging midifile
|
401
410
|
for distribution.
|
402
411
|
|
403
|
-
|
412
|
+
=== Changes for 1.0.0:
|
404
413
|
|
405
414
|
* Fixed the bug in Track#recalc_delta_from_times found by Christopher Rose.
|
406
415
|
|
407
|
-
|
416
|
+
=== Changes for 0.8.7:
|
408
417
|
|
409
418
|
* Fixed the misspelled POLY_PRESSURE constant, thanks to Mario Pehle.
|
410
419
|
|
411
|
-
|
420
|
+
=== Changes for 0.8.6:
|
412
421
|
|
413
422
|
* Added missing test/test.mid.
|
414
423
|
|
415
|
-
|
424
|
+
=== Changes for 0.8.5:
|
416
425
|
|
417
426
|
* Fixed bugs in MIDI::PitchBend reading and writing, thanks to Emanuel
|
418
427
|
Borsboom.
|
@@ -425,7 +434,7 @@ The midilib code is now hosted at Github (http://github.com/jimm/midilib).
|
|
425
434
|
quantize. However, since that method was broken already, I don't feel it's
|
426
435
|
a burden to anybody to change the arguments.
|
427
436
|
|
428
|
-
|
437
|
+
=== Changes for 0.8.4:
|
429
438
|
|
430
439
|
* Realtime status bytes now set @is_realtime to true and return true when
|
431
440
|
realtime? is called.
|
@@ -442,7 +451,7 @@ The midilib code is now hosted at Github (http://github.com/jimm/midilib).
|
|
442
451
|
MIDI::Sequence::note_to_delta.
|
443
452
|
|
444
453
|
|
445
|
-
|
454
|
+
=== Changes for 0.8.3:
|
446
455
|
|
447
456
|
* Added MIDI::NoteEvent.note_to_s, which returns note name as a string like
|
448
457
|
"C4" or "F#6".
|
@@ -451,7 +460,7 @@ The midilib code is now hosted at Github (http://github.com/jimm/midilib).
|
|
451
460
|
@print_note_names. These are used by all Event to_s methods. See
|
452
461
|
examples/seq2text.rb for an example.
|
453
462
|
|
454
|
-
|
463
|
+
=== Changes for 0.8.2:
|
455
464
|
|
456
465
|
* Changed MIDI::MetaEvent.type to MIDI::MetaEvent.event_type to avoid
|
457
466
|
runtime complaints about Object#type calls.
|
@@ -460,7 +469,7 @@ The midilib code is now hosted at Github (http://github.com/jimm/midilib).
|
|
460
469
|
* Fixed read and write block arguments.
|
461
470
|
* Fixed other example script bugs.
|
462
471
|
|
463
|
-
|
472
|
+
=== Changes for 0.8.1:
|
464
473
|
|
465
474
|
* Fixed track sorting.
|
466
475
|
* Fixed track's recalc_delta_from_times method.
|
data/Rakefile
CHANGED
@@ -1,52 +1,46 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require 'rake/testtask'
|
7
|
-
else
|
8
|
-
require 'rake/rdoctask'
|
9
|
-
require 'rake/gempackagetask'
|
10
|
-
require 'rake/runtest'
|
11
|
-
end
|
3
|
+
require 'rdoc/task'
|
4
|
+
require 'rubygems/package_task'
|
5
|
+
require 'rake/testtask'
|
12
6
|
|
13
7
|
PROJECT_NAME = 'midilib'
|
14
8
|
RDOC_DIR = 'html'
|
15
9
|
|
16
10
|
PKG_FILES = FileList[ 'ChangeLog', 'Credits', 'Rakefile',
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
'README.rdoc', 'TODO.rdoc',
|
12
|
+
'examples/**/*',
|
13
|
+
'html/**/*',
|
14
|
+
'install.rb',
|
15
|
+
'lib/**/*.rb',
|
16
|
+
'test/**/*']
|
23
17
|
|
24
|
-
task :
|
18
|
+
task default: [:package]
|
25
19
|
|
26
20
|
spec = Gem::Specification.new do |s|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
s.platform = Gem::Platform::RUBY
|
22
|
+
s.name = PROJECT_NAME
|
23
|
+
s.version = `ruby -Ilib -e 'require "midilib/info"; puts MIDI::Version'`.strip
|
24
|
+
s.requirements << 'none'
|
31
25
|
|
32
|
-
|
26
|
+
s.require_path = 'lib'
|
33
27
|
|
34
|
-
|
28
|
+
s.files = PKG_FILES.to_a
|
35
29
|
|
36
|
-
|
37
|
-
|
38
|
-
s.extra_rdoc_files = ['README.rdoc', 'TODO.rdoc']
|
30
|
+
s.rdoc_options << '--main' << 'README.rdoc'
|
31
|
+
s.extra_rdoc_files = ['README.rdoc', 'TODO.rdoc']
|
39
32
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
33
|
+
s.author = 'Jim Menard'
|
34
|
+
s.email = 'jim@jimmenard.com'
|
35
|
+
s.homepage = 'http://github.com/jimm/midilib'
|
36
|
+
s.rubyforge_project = PROJECT_NAME
|
37
|
+
s.license = 'Ruby'
|
44
38
|
|
45
|
-
|
46
|
-
|
47
|
-
midilib is a pure Ruby MIDI library useful for reading and
|
48
|
-
writing standard MIDI files and manipulating MIDI event data.
|
49
|
-
EOF
|
39
|
+
s.summary = 'MIDI file and event manipulation library'
|
40
|
+
s.description = <<~EOF
|
41
|
+
midilib is a pure Ruby MIDI library useful for reading and
|
42
|
+
writing standard MIDI files and manipulating MIDI event data.
|
43
|
+
EOF
|
50
44
|
end
|
51
45
|
|
52
46
|
if RUBY_VERSION >= '1.9'
|
@@ -66,29 +60,18 @@ else
|
|
66
60
|
end
|
67
61
|
|
68
62
|
# creates an "rdoc" task
|
69
|
-
Rake::RDocTask.new do |
|
70
|
-
|
71
|
-
|
72
|
-
|
63
|
+
Rake::RDocTask.new do |rd|
|
64
|
+
rd.main = 'README.rdoc'
|
65
|
+
rd.title = PROJECT_NAME
|
66
|
+
rd.rdoc_files.include('README.rdoc', 'TODO.rdoc', 'lib/**/*.rb')
|
73
67
|
end
|
74
68
|
|
75
|
-
desc
|
76
|
-
task :
|
69
|
+
desc 'Publish gem'
|
70
|
+
task publish: %i[rdoc package] do
|
77
71
|
version = `ruby -Ilib -e 'require "midilib/info"; puts MIDI::Version'`.strip
|
78
72
|
system "gem push pkg/midilib-#{version}.gem"
|
79
73
|
end
|
80
74
|
|
81
|
-
|
82
|
-
Rake::TestTask.new do |t|
|
83
|
-
t.libs << File.join(File.dirname(__FILE__), 'test')
|
84
|
-
t.libs << File.join(File.dirname(__FILE__), 'lib')
|
85
|
-
t.ruby_opts << '-rubygems'
|
86
|
-
t.pattern = "test/**/test_*.rb"
|
87
|
-
end
|
88
|
-
else
|
89
|
-
task :test do
|
90
|
-
Rake::run_tests
|
91
|
-
end
|
92
|
-
end
|
75
|
+
Rake::TestTask.new
|
93
76
|
|
94
|
-
task :
|
77
|
+
task clean: %i[clobber_rdoc clobber_package]
|
data/TODO.rdoc
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
== Bugs
|
2
2
|
|
3
|
-
|
3
|
+
midilib does not handle tempo changes when calculating +beats_per_minute+.
|
4
|
+
The tempo events are correctly handled when reading/writing/moving them
|
5
|
+
around, it's just the functions that answer questions about the current
|
6
|
+
tempo that are wrong. See https://github.com/jimm/midilib/issues/8. The
|
7
|
+
method +beats_per_minute+ and related methods like +pulses_to_seconds+ will
|
8
|
+
have to take into account the possibility of more than one tempo event. They
|
9
|
+
will probably have to take new arguments specifying where in the sequence
|
10
|
+
the beats or pulses are being requested. For example we could have
|
11
|
+
+beats_per_minute(at_seconds: 0.0, at_beat: 0.0)+ (where the two keyword
|
12
|
+
args are mutually exclusive). Perhaps there should be separately named
|
13
|
+
public methods like +beats_per_minute_at_seconds+ and
|
14
|
+
+beats_per_minute_at_beat+ as well.
|
4
15
|
|
5
16
|
== Features
|
6
17
|
|
@@ -15,7 +26,7 @@ No known bugs. (If that's not a challenge, I don't know what is.)
|
|
15
26
|
|
16
27
|
* Implement key signature in SeqReader.
|
17
28
|
|
18
|
-
*
|
29
|
+
* Ignore unknown chunks in MIDI files. See the MIDI file spec.
|
19
30
|
|
20
31
|
* Format 2 files(?).
|
21
32
|
|
data/examples/from_scratch.rb
CHANGED
@@ -14,7 +14,7 @@ require 'midilib/sequence'
|
|
14
14
|
require 'midilib/consts'
|
15
15
|
include MIDI
|
16
16
|
|
17
|
-
seq = Sequence.new
|
17
|
+
seq = Sequence.new
|
18
18
|
|
19
19
|
# Create a first track for the sequence. This holds tempo events and stuff
|
20
20
|
# like that.
|
@@ -40,10 +40,10 @@ track.events << Controller.new(0, CC_VOLUME, 127)
|
|
40
40
|
# delta time length of a single quarter note.
|
41
41
|
track.events << ProgramChange.new(0, 1, 0)
|
42
42
|
quarter_note_length = seq.note_to_delta('quarter')
|
43
|
-
[0, 2, 4, 5, 7, 9, 11, 12].each
|
43
|
+
[0, 2, 4, 5, 7, 9, 11, 12].each do |offset|
|
44
44
|
track.events << NoteOn.new(0, 64 + offset, 127, 0)
|
45
45
|
track.events << NoteOff.new(0, 64 + offset, 127, quarter_note_length)
|
46
|
-
|
46
|
+
end
|
47
47
|
|
48
48
|
# Calling recalc_times is not necessary, because that only sets the events'
|
49
49
|
# start times, which are not written out to the MIDI file. The delta times are
|
@@ -51,6 +51,4 @@ quarter_note_length = seq.note_to_delta('quarter')
|
|
51
51
|
|
52
52
|
# track.recalc_times
|
53
53
|
|
54
|
-
File.open('from_scratch.mid', 'wb') { | file
|
55
|
-
seq.write(file)
|
56
|
-
}
|
54
|
+
File.open('from_scratch.mid', 'wb') { |file| seq.write(file) }
|
data/examples/measures_mbt.rb
CHANGED
@@ -13,18 +13,18 @@ $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
|
13
13
|
|
14
14
|
require 'midilib/sequence'
|
15
15
|
|
16
|
-
seq = MIDI::Sequence.new
|
17
|
-
File.open(ARGV[0], 'rb') { |
|
16
|
+
seq = MIDI::Sequence.new
|
17
|
+
File.open(ARGV[0], 'rb') { |file| seq.read(file) }
|
18
18
|
|
19
19
|
# Get all measures, so events can be mapped to measures:
|
20
20
|
measures = seq.get_measures
|
21
21
|
|
22
|
-
seq.each
|
23
|
-
track.each
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
seq.each do |track|
|
23
|
+
track.each do |e|
|
24
|
+
next unless e.is_a?(MIDI::NoteOn)
|
25
|
+
|
26
|
+
# Print out start of notes
|
27
|
+
e.print_note_names = true
|
28
|
+
puts measures.to_mbt(e) + " ch #{e.channel}: #{e.note_to_s}"
|
29
|
+
end
|
30
|
+
end
|
@@ -9,20 +9,20 @@ require 'midilib/sequence'
|
|
9
9
|
DEFAULT_MIDI_TEST_FILE = 'NoFences.mid'
|
10
10
|
|
11
11
|
# Read from MIDI file
|
12
|
-
seq = MIDI::Sequence.new
|
12
|
+
seq = MIDI::Sequence.new
|
13
13
|
|
14
|
-
File.open(ARGV[0] || DEFAULT_MIDI_TEST_FILE, 'rb')
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
File.open(ARGV[0] || DEFAULT_MIDI_TEST_FILE, 'rb') do |file|
|
15
|
+
# The block we pass in to Sequence.read is called at the end of every
|
16
|
+
# track read. It is optional, but is useful for progress reports.
|
17
|
+
seq.read(file)
|
18
|
+
end
|
19
19
|
|
20
|
-
seq.each
|
20
|
+
seq.each do |track|
|
21
21
|
puts
|
22
22
|
puts "*** track name \"#{track.name}\", \"#{track.instrument}\""
|
23
|
-
track.each
|
23
|
+
track.each do |e|
|
24
24
|
e.print_decimal_numbers = true
|
25
25
|
e.print_channel_numbers_from_one = true
|
26
|
-
puts e if e.
|
27
|
-
|
28
|
-
|
26
|
+
puts e if e.is_a?(MIDI::ProgramChange)
|
27
|
+
end
|
28
|
+
end
|