midilib 2.0.2 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|