music-performance 0.3.0 → 0.4.0
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4b9f81c3aba7e25db75da9d71fc2ba25a842599
|
4
|
+
data.tar.gz: 2c5887333f7d6fb3ede15a6813ee1f89847f9fbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73c9896e59861efa226a2769bd621e869bbf56ba9d3ce1c1301f621dd7d41b3c175d07571568fd55244c5bf943f3243d7c49c8d1c9a4ef785faf7561ea2c3c5f
|
7
|
+
data.tar.gz: 1b8d20d458e90a90ee7211f71963becd03ebc563a124be25822f27d92c4738fe3c5735c38d3320dbaddda9c3e6eb3fc3c2e9fee499436d73ec2920b0da7f5b50
|
data/bin/midify
CHANGED
@@ -6,11 +6,17 @@ doc = <<DOCOPT
|
|
6
6
|
Loads a music-transcription score from YAML file, and converts to MIDI file.
|
7
7
|
|
8
8
|
Usage:
|
9
|
-
#{exe_name} <input>
|
9
|
+
#{exe_name} <input> [PART PROGRAM] ...
|
10
10
|
#{exe_name} <input> <output>
|
11
11
|
#{exe_name} -h | --help
|
12
12
|
#{exe_name} --version
|
13
13
|
|
14
|
+
Arguments:
|
15
|
+
input A music-transcription score file in YAML format
|
16
|
+
output Midi filename
|
17
|
+
PART name of a part in the score
|
18
|
+
PROGRAM MIDI program (instrument) number for the given part
|
19
|
+
|
14
20
|
Options:
|
15
21
|
-h --help Show this screen.
|
16
22
|
--version Show version.
|
@@ -42,8 +48,12 @@ File.open(fin_name) do |fin|
|
|
42
48
|
puts "complete"
|
43
49
|
|
44
50
|
if score.valid?
|
51
|
+
part_names = args["PART"]
|
52
|
+
program_nums = args["PROGRAM"].map {|str| str.to_i }
|
53
|
+
instr_map = Hash[[part_names,program_nums].transpose]
|
54
|
+
|
45
55
|
print "Making MIDI sequence..."
|
46
|
-
seq = Performance::ScoreSequencer.new(score).make_midi_seq
|
56
|
+
seq = Performance::ScoreSequencer.new(score).make_midi_seq(instr_map)
|
47
57
|
puts "complete"
|
48
58
|
|
49
59
|
fout_name = args["<output>"]
|
@@ -15,8 +15,8 @@ class PartSequencer
|
|
15
15
|
@events = (note_events + dynamic_events).sort
|
16
16
|
end
|
17
17
|
|
18
|
-
def make_midi_track midi_sequence, part_name, channel, ppqn
|
19
|
-
track = begin_track(midi_sequence, part_name, channel)
|
18
|
+
def make_midi_track midi_sequence, part_name, channel, ppqn, program
|
19
|
+
track = begin_track(midi_sequence, part_name, channel, program)
|
20
20
|
|
21
21
|
prev_offset = 0
|
22
22
|
@events.each do |offset, event|
|
@@ -103,19 +103,19 @@ class PartSequencer
|
|
103
103
|
return dynamic_events
|
104
104
|
end
|
105
105
|
|
106
|
-
def begin_track midi_sequence, part_name, channel
|
106
|
+
def begin_track midi_sequence, part_name, channel, program
|
107
107
|
# Track to hold part notes
|
108
108
|
track = MIDI::Track.new(midi_sequence)
|
109
109
|
|
110
110
|
# Name the track and instrument
|
111
|
-
track.name = part_name
|
111
|
+
track.name = part_name
|
112
112
|
track.instrument = MIDI::GM_PATCH_NAMES[0]
|
113
113
|
|
114
114
|
# Add a volume controller event (optional).
|
115
115
|
track.events << MIDI::Controller.new(channel, MIDI::CC_VOLUME, 127)
|
116
116
|
|
117
117
|
# Change to particular instrument sound
|
118
|
-
track.events << MIDI::ProgramChange.new(channel,
|
118
|
+
track.events << MIDI::ProgramChange.new(channel, program)
|
119
119
|
|
120
120
|
return track
|
121
121
|
end
|
@@ -7,9 +7,14 @@ class ScoreSequencer
|
|
7
7
|
score.start_meter.beat_duration)
|
8
8
|
@start_usec_per_qnote = MidiUtil.usec_per_qnote(start_nps)
|
9
9
|
@parts = ScoreCollator.new(score).collate_parts
|
10
|
+
|
11
|
+
# part names should all be strings, because 1) a midi track name needs to
|
12
|
+
# be a string and 2) the instrument map used to map part names to MIDI
|
13
|
+
# program numbers will use part name strings as keys.
|
14
|
+
@parts = Hash[ @parts.map {|k,v| [k.to_s,v] } ]
|
10
15
|
end
|
11
16
|
|
12
|
-
def make_midi_seq
|
17
|
+
def make_midi_seq instr_map = {}
|
13
18
|
seq = MIDI::Sequence.new()
|
14
19
|
|
15
20
|
# first track for the sequence holds time sig and tempo events
|
@@ -20,8 +25,13 @@ class ScoreSequencer
|
|
20
25
|
|
21
26
|
channel = 0
|
22
27
|
@parts.each do |part_name,part|
|
28
|
+
program = 1
|
29
|
+
if instr_map.has_key?(part_name)
|
30
|
+
program = instr_map[part_name]
|
31
|
+
end
|
32
|
+
|
23
33
|
pseq = PartSequencer.new(part)
|
24
|
-
seq.tracks << pseq.make_midi_track(seq, part_name, channel, seq.ppqn)
|
34
|
+
seq.tracks << pseq.make_midi_track(seq, part_name, channel, seq.ppqn, program)
|
25
35
|
channel += 1
|
26
36
|
end
|
27
37
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: music-performance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Tunnell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|