mtk 0.0.2 → 0.0.3

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.
Files changed (147) hide show
  1. data/.yardopts +3 -2
  2. data/DEVELOPMENT_NOTES.md +114 -0
  3. data/INTRO.md +64 -8
  4. data/LICENSE.txt +1 -1
  5. data/README.md +31 -102
  6. data/Rakefile +56 -18
  7. data/bin/mtk +215 -0
  8. data/examples/crescendo.rb +5 -5
  9. data/examples/drum_pattern1.rb +23 -0
  10. data/examples/dynamic_pattern.rb +8 -11
  11. data/examples/gets_and_play.rb +26 -0
  12. data/examples/notation.rb +22 -0
  13. data/examples/play_midi.rb +8 -10
  14. data/examples/random_tone_row.rb +2 -2
  15. data/examples/syntax_to_midi.rb +28 -0
  16. data/examples/test_output.rb +8 -0
  17. data/examples/tone_row_melody.rb +6 -6
  18. data/lib/mtk.rb +52 -40
  19. data/lib/mtk/chord.rb +55 -0
  20. data/lib/mtk/constants/durations.rb +57 -0
  21. data/lib/mtk/constants/intensities.rb +61 -0
  22. data/lib/mtk/constants/intervals.rb +73 -0
  23. data/lib/mtk/constants/pitch_classes.rb +29 -0
  24. data/lib/mtk/constants/pitches.rb +52 -0
  25. data/lib/mtk/duration.rb +211 -0
  26. data/lib/mtk/events/event.rb +119 -0
  27. data/lib/mtk/events/note.rb +112 -0
  28. data/lib/mtk/events/parameter.rb +54 -0
  29. data/lib/mtk/helpers/collection.rb +164 -0
  30. data/lib/mtk/helpers/convert.rb +36 -0
  31. data/lib/mtk/helpers/lilypond.rb +162 -0
  32. data/lib/mtk/helpers/output_selector.rb +67 -0
  33. data/lib/mtk/helpers/pitch_collection.rb +23 -0
  34. data/lib/mtk/helpers/pseudo_constants.rb +26 -0
  35. data/lib/mtk/intensity.rb +156 -0
  36. data/lib/mtk/interval.rb +155 -0
  37. data/lib/mtk/lang/mtk_grammar.citrus +190 -13
  38. data/lib/mtk/lang/parser.rb +29 -0
  39. data/lib/mtk/melody.rb +94 -0
  40. data/lib/mtk/midi/dls_synth_device.rb +144 -0
  41. data/lib/mtk/midi/dls_synth_output.rb +62 -0
  42. data/lib/mtk/midi/file.rb +67 -32
  43. data/lib/mtk/midi/input.rb +97 -0
  44. data/lib/mtk/midi/jsound_input.rb +36 -17
  45. data/lib/mtk/midi/jsound_output.rb +48 -46
  46. data/lib/mtk/midi/output.rb +195 -0
  47. data/lib/mtk/midi/unimidi_input.rb +117 -0
  48. data/lib/mtk/midi/unimidi_output.rb +121 -0
  49. data/lib/mtk/{_numeric_extensions.rb → numeric_extensions.rb} +12 -0
  50. data/lib/mtk/patterns/chain.rb +49 -0
  51. data/lib/mtk/{pattern → patterns}/choice.rb +14 -8
  52. data/lib/mtk/patterns/cycle.rb +18 -0
  53. data/lib/mtk/patterns/for_each.rb +71 -0
  54. data/lib/mtk/patterns/function.rb +39 -0
  55. data/lib/mtk/{pattern → patterns}/lines.rb +11 -17
  56. data/lib/mtk/{pattern → patterns}/palindrome.rb +11 -8
  57. data/lib/mtk/patterns/pattern.rb +171 -0
  58. data/lib/mtk/patterns/sequence.rb +20 -0
  59. data/lib/mtk/pitch.rb +7 -6
  60. data/lib/mtk/pitch_class.rb +124 -46
  61. data/lib/mtk/pitch_class_set.rb +58 -35
  62. data/lib/mtk/sequencers/event_builder.rb +131 -0
  63. data/lib/mtk/sequencers/legato_sequencer.rb +24 -0
  64. data/lib/mtk/sequencers/rhythmic_sequencer.rb +28 -0
  65. data/lib/mtk/{sequencer/abstract_sequencer.rb → sequencers/sequencer.rb} +37 -11
  66. data/lib/mtk/{sequencer → sequencers}/step_sequencer.rb +4 -4
  67. data/lib/mtk/timeline.rb +39 -22
  68. data/lib/mtk/variable.rb +32 -0
  69. data/spec/mtk/chord_spec.rb +83 -0
  70. data/spec/mtk/{_constants → constants}/durations_spec.rb +12 -41
  71. data/spec/mtk/{_constants → constants}/intensities_spec.rb +13 -37
  72. data/spec/mtk/{_constants → constants}/intervals_spec.rb +14 -32
  73. data/spec/mtk/{_constants → constants}/pitch_classes_spec.rb +8 -4
  74. data/spec/mtk/{_constants → constants}/pitches_spec.rb +5 -1
  75. data/spec/mtk/duration_spec.rb +372 -0
  76. data/spec/mtk/events/event_spec.rb +234 -0
  77. data/spec/mtk/events/note_spec.rb +174 -0
  78. data/spec/mtk/events/parameter_spec.rb +220 -0
  79. data/spec/mtk/{helper → helpers}/collection_spec.rb +86 -3
  80. data/spec/mtk/{helper → helpers}/pseudo_constants_spec.rb +2 -2
  81. data/spec/mtk/intensity_spec.rb +289 -0
  82. data/spec/mtk/interval_spec.rb +265 -0
  83. data/spec/mtk/lang/parser_spec.rb +597 -0
  84. data/spec/mtk/melody_spec.rb +223 -0
  85. data/spec/mtk/midi/file_spec.rb +16 -16
  86. data/spec/mtk/midi/jsound_input_spec.rb +11 -0
  87. data/spec/mtk/midi/jsound_output_spec.rb +11 -0
  88. data/spec/mtk/midi/output_spec.rb +102 -0
  89. data/spec/mtk/midi/unimidi_input_spec.rb +11 -0
  90. data/spec/mtk/midi/unimidi_output_spec.rb +11 -0
  91. data/spec/mtk/{_numeric_extensions_spec.rb → numeric_extensions_spec.rb} +1 -0
  92. data/spec/mtk/patterns/chain_spec.rb +110 -0
  93. data/spec/mtk/{pattern → patterns}/choice_spec.rb +20 -30
  94. data/spec/mtk/{pattern → patterns}/cycle_spec.rb +25 -35
  95. data/spec/mtk/patterns/for_each_spec.rb +136 -0
  96. data/spec/mtk/{pattern → patterns}/function_spec.rb +17 -30
  97. data/spec/mtk/{pattern → patterns}/lines_spec.rb +11 -27
  98. data/spec/mtk/{pattern → patterns}/palindrome_spec.rb +13 -29
  99. data/spec/mtk/patterns/pattern_spec.rb +132 -0
  100. data/spec/mtk/patterns/sequence_spec.rb +203 -0
  101. data/spec/mtk/pitch_class_set_spec.rb +23 -21
  102. data/spec/mtk/pitch_class_spec.rb +151 -39
  103. data/spec/mtk/pitch_spec.rb +22 -1
  104. data/spec/mtk/sequencers/event_builder_spec.rb +245 -0
  105. data/spec/mtk/sequencers/legato_sequencer_spec.rb +45 -0
  106. data/spec/mtk/sequencers/rhythmic_sequencer_spec.rb +84 -0
  107. data/spec/mtk/sequencers/sequencer_spec.rb +215 -0
  108. data/spec/mtk/{sequencer → sequencers}/step_sequencer_spec.rb +35 -13
  109. data/spec/mtk/timeline_spec.rb +109 -16
  110. data/spec/mtk/variable_spec.rb +52 -0
  111. data/spec/spec_coverage.rb +2 -0
  112. data/spec/spec_helper.rb +3 -0
  113. metadata +188 -91
  114. data/lib/mtk/_constants/durations.rb +0 -80
  115. data/lib/mtk/_constants/intensities.rb +0 -81
  116. data/lib/mtk/_constants/intervals.rb +0 -85
  117. data/lib/mtk/_constants/pitch_classes.rb +0 -35
  118. data/lib/mtk/_constants/pitches.rb +0 -49
  119. data/lib/mtk/event.rb +0 -70
  120. data/lib/mtk/helper/collection.rb +0 -114
  121. data/lib/mtk/helper/event_builder.rb +0 -85
  122. data/lib/mtk/helper/pseudo_constants.rb +0 -26
  123. data/lib/mtk/lang/grammar.rb +0 -17
  124. data/lib/mtk/note.rb +0 -63
  125. data/lib/mtk/pattern/abstract_pattern.rb +0 -132
  126. data/lib/mtk/pattern/cycle.rb +0 -51
  127. data/lib/mtk/pattern/enumerator.rb +0 -26
  128. data/lib/mtk/pattern/function.rb +0 -46
  129. data/lib/mtk/pattern/sequence.rb +0 -30
  130. data/lib/mtk/pitch_set.rb +0 -84
  131. data/lib/mtk/sequencer/rhythmic_sequencer.rb +0 -29
  132. data/lib/mtk/transform/invertible.rb +0 -15
  133. data/lib/mtk/transform/mappable.rb +0 -18
  134. data/lib/mtk/transform/set_theory_operations.rb +0 -34
  135. data/lib/mtk/transform/transposable.rb +0 -14
  136. data/spec/mtk/event_spec.rb +0 -139
  137. data/spec/mtk/helper/event_builder_spec.rb +0 -92
  138. data/spec/mtk/lang/grammar_spec.rb +0 -100
  139. data/spec/mtk/note_spec.rb +0 -115
  140. data/spec/mtk/pattern/abstract_pattern_spec.rb +0 -45
  141. data/spec/mtk/pattern/note_cycle_spec.rb.bak +0 -116
  142. data/spec/mtk/pattern/pitch_cycle_spec.rb.bak +0 -47
  143. data/spec/mtk/pattern/pitch_sequence_spec.rb.bak +0 -37
  144. data/spec/mtk/pattern/sequence_spec.rb +0 -151
  145. data/spec/mtk/pitch_set_spec.rb +0 -198
  146. data/spec/mtk/sequencer/abstract_sequencer_spec.rb +0 -159
  147. data/spec/mtk/sequencer/rhythmic_sequencer_spec.rb +0 -49
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe MTK::Sequencer::StepSequencer do
3
+ describe MTK::Sequencers::StepSequencer do
4
4
 
5
- STEP_SEQUENCER = Sequencer::StepSequencer
5
+ STEP_SEQUENCER = Sequencers::StepSequencer
6
6
 
7
- let(:pitches) { Pattern.PitchSequence(C4, D4, E4) }
8
- let(:intensities) { Pattern.IntensitySequence(0.3, 0.7, 1.0) }
9
- let(:durations) { Pattern.DurationSequence(1, 1, 2) }
7
+ let(:pitches) { Patterns.PitchSequence(C4, D4, E4) }
8
+ let(:intensities) { Patterns.IntensitySequence(0.3, 0.7, 1.0) }
9
+ let(:durations) { Patterns.DurationSequence(1, 1, 2) }
10
10
  let(:step_sequencer) { STEP_SEQUENCER.new [pitches, intensities, durations] }
11
11
 
12
12
  describe "#new" do
@@ -38,9 +38,17 @@ describe MTK::Sequencer::StepSequencer do
38
38
  it "contains notes assembled from the given patterns" do
39
39
  timeline = step_sequencer.to_timeline
40
40
  timeline.should == Timeline.from_hash({
41
- 0 => Note(C4,0.3,1),
42
- 1 => Note(D4,0.7,1),
43
- 2 => Note(E4,1.0,2)
41
+ 0 => Note(C4,1,0.3),
42
+ 1 => Note(D4,1,0.7),
43
+ 2 => Note(E4,2,1.0)
44
+ })
45
+ end
46
+
47
+ it "treats negative durations as rests" do
48
+ timeline = STEP_SEQUENCER.new( [pitches, intensities, Patterns.DurationSequence(1, -1, 2)] ).to_timeline
49
+ timeline.should == Timeline.from_hash({
50
+ 0 => Note(C4,1,0.3),
51
+ 2 => Note(E4,2,1.0)
44
52
  })
45
53
  end
46
54
  end
@@ -50,9 +58,9 @@ describe MTK::Sequencer::StepSequencer do
50
58
  step_sequencer.step_size = 2
51
59
  timeline = step_sequencer.to_timeline
52
60
  timeline.should == Timeline.from_hash({
53
- 0 => Note(C4,0.3,1),
54
- 2 => Note(D4,0.7,1),
55
- 4 => Note(E4,1.0,2)
61
+ 0 => Note(C4,1,0.3),
62
+ 2 => Note(D4,1,0.7),
63
+ 4 => Note(E4,2,1.0)
56
64
  })
57
65
  end
58
66
  end
@@ -62,10 +70,24 @@ describe MTK::Sequencer::StepSequencer do
62
70
  step_sequencer.max_steps = 2
63
71
  timeline = step_sequencer.to_timeline
64
72
  timeline.should == Timeline.from_hash({
65
- 0 => Note(C4,0.3,1),
66
- 1 => Note(D4,0.7,1)
73
+ 0 => Note(C4,1,0.3),
74
+ 1 => Note(D4,1,0.7)
67
75
  })
68
76
  end
69
77
  end
70
78
 
79
+ end
80
+
81
+
82
+ describe MTK::Sequencers do
83
+
84
+ describe "#StepSequencer" do
85
+ it "creates a StepSequencer" do
86
+ MTK::Sequencers.StepSequencer(1,2,3).should be_a MTK::Sequencers::StepSequencer
87
+ end
88
+
89
+ it "sets #patterns from the varargs" do
90
+ MTK::Sequencers.StepSequencer(1,2,3).patterns.should == [1,2,3]
91
+ end
92
+ end
71
93
  end
@@ -2,19 +2,19 @@ require 'spec_helper'
2
2
 
3
3
  describe MTK::Timeline do
4
4
 
5
- let(:note1) { Note.new(C4, p, 1) }
6
- let(:note2) { Note.new(G4, f, 2) }
7
- let(:timeline_raw_data) { { 0 => note1, 1 => [note1, note2] } }
8
- let(:timeline_hash) { { 0 => [note1], 1 => [note1, note2] } }
5
+ let(:note1) { Note(C4, p, 1) }
6
+ let(:note2) { Note(G4, o, 2) }
7
+ let(:timeline_raw_data) { { 0.0 => note1, 1.0 => [note1, note2] } }
8
+ let(:timeline_hash) { { 0.0 => [note1], 1.0 => [note1, note2] } }
9
9
  let(:timeline) { Timeline.from_hash(timeline_raw_data) }
10
10
 
11
- let(:unquantized_data) { { 0.0 => [note1], 0.7 => [note1], 1.24 => [note1], 1.25 => [note1] } }
11
+ let(:unquantized_data) { { 0.0 => [note1], 0.7 => [note1], 1.1 => [note2], 1.24 => [note1], 1.25 => [note1] } }
12
12
  let(:unquantized_timeline) { Timeline.from_hash(unquantized_data) }
13
13
  let(:quantization_interval) { 0.5 }
14
- let(:quantized_data) { { 0.0 => [note1], 0.5 => [note1], 1.0 => [note1], 1.5 => [note1] } }
14
+ let(:quantized_data) { { 0.0 => [note1], 0.5 => [note1], 1.0 => [note2, note1], 1.5 => [note1] } }
15
15
 
16
- let(:shifted_data) { { 5 => [note1], 6 => [note1, note2] } }
17
- let(:reverse_shifted_data) { { -5 => [note1], -4 => [note1, note2] } }
16
+ let(:shifted_data) { { 5.0 => [note1], 6.0 => [note1, note2] } }
17
+ let(:reverse_shifted_data) { { -5.0 => [note1], -4.0 => [note1, note2] } }
18
18
  let(:shift_amount) { 5 }
19
19
 
20
20
  it "is Enumerable" do
@@ -81,24 +81,43 @@ describe MTK::Timeline do
81
81
  it "returns nil when no events exist at the timepoint" do
82
82
  timeline[3].should == nil
83
83
  end
84
+
85
+ it "coerces the argument for consistent lookup behavior" do
86
+ timeline[0].should == [note1]
87
+ timeline[0.0].should == [note1]
88
+ timeline[Rational(0)].should == [note1]
89
+ timeline[nil].should == [note1]
90
+ end
84
91
  end
85
92
 
93
+
86
94
  describe "#[]=" do
87
95
  it "set a single event at the given timepoint" do
88
96
  timeline[5] = note1
89
97
  timeline[5].should == [note1]
90
98
  end
99
+
91
100
  it "set an array of events at the given timepoint" do
92
101
  timeline[5] = [note1, note2]
93
102
  timeline[5].should == [note1, note2]
94
103
  end
104
+
95
105
  it "replaces existing events at the timepoint" do
96
106
  timeline[5] = note1
97
107
  timeline[5] = note2
98
108
  timeline[5].should == [note2]
99
109
  end
110
+
111
+ it "coerces the argument to floating point for consistent lookup behavior" do
112
+ timeline = Timeline.new
113
+ timeline[nil] = note1
114
+ timeline[1] = note1
115
+ timeline[Rational(3,2)] = note1
116
+ timeline.times.should == [0.0, 1.0, 1.5]
117
+ end
100
118
  end
101
119
 
120
+
102
121
  describe "#add" do
103
122
  it "creates a new event list at a previously empty timepoint" do
104
123
  timeline.add(5, note1)
@@ -115,12 +134,25 @@ describe MTK::Timeline do
115
134
  timeline.add 5, [note1, note2]
116
135
  timeline[5].should == [note1, note2]
117
136
  end
137
+
138
+ it "coerces the argument to floating point for consistent lookup behavior" do
139
+ timeline = Timeline.new
140
+ timeline.add(nil, note1)
141
+ timeline.add(1, note1)
142
+ timeline.add(Rational(3,2), note1)
143
+ timeline.times.should == [0.0, 1.0, 1.5]
144
+ end
118
145
  end
119
146
 
120
147
  describe "#delete" do
121
148
  it "removes an event list at the given time" do
122
149
  timeline.delete(1)
123
- timeline.should == { 0 => [note1] }
150
+ timeline.should == { 0.0 => [note1] }
151
+ end
152
+
153
+ it "coerces the argument to floating point for consistent lookup behavior" do
154
+ timeline.delete(Rational(1))
155
+ timeline.should == { 0.0 => [note1] }
124
156
  end
125
157
  end
126
158
 
@@ -139,6 +171,24 @@ describe MTK::Timeline do
139
171
  end
140
172
  end
141
173
 
174
+ describe "length" do
175
+ it "is the lastest time + the longest duration of events at that time" do
176
+ len = timeline.length
177
+ len.should be_a ::MTK::Duration
178
+ len.should == ::MTK.Duration(3)
179
+ end
180
+ end
181
+
182
+ describe "empty?" do
183
+ it "is true when there are no events in the timeline" do
184
+ Timeline.new.empty?.should be_true
185
+ end
186
+
187
+ it "is false where there are events in the timeline" do
188
+ timeline.empty?.should be_false
189
+ end
190
+ end
191
+
142
192
  describe "#==" do
143
193
  it "is true when the underlying Hashes are equal" do
144
194
  timeline.should == Timeline.from_hash(timeline_hash)
@@ -168,7 +218,19 @@ describe MTK::Timeline do
168
218
  describe "#map" do
169
219
  it "returns a new Timeline where each [time,event] pair is replaced by the result of block" do
170
220
  mapped = timeline.map{|time,events| [time+1, events.map{|e| e.transpose(time+2) }] }
171
- mapped.should == { 1 => [note1.transpose(2)], 2 => [note1.transpose(3), note2.transpose(3)] }
221
+ mapped.should == { 1.0 => [note1.transpose(2)], 2.0 => [note1.transpose(3), note2.transpose(3)] }
222
+ end
223
+
224
+ it "handle events from different times being mapped to the same time" do
225
+ timeline = MTK::Timeline.from_hash({ 0.0 => [note1], 1.0 => [note1], 2.0 => [note2] })
226
+ mapped = timeline.map do |time,events|
227
+ if events == [note1]
228
+ [1.0, events]
229
+ else
230
+ [2.0, events]
231
+ end
232
+ end
233
+ mapped.should == { 1.0 => [note1,note1], 2.0 => [note2] }
172
234
  end
173
235
 
174
236
  it "does not modify this Timeline" do
@@ -180,14 +242,14 @@ describe MTK::Timeline do
180
242
  describe "#map!" do
181
243
  it "maps the Timeline in place" do
182
244
  timeline.map! {|time,events| [time+1, events.map{|e| e.transpose(time+2) }] }
183
- timeline.should == { 1 => [note1.transpose(2)], 2 => [note1.transpose(3), note2.transpose(3)] }
245
+ timeline.should == { 1.0 => [note1.transpose(2)], 2.0 => [note1.transpose(3), note2.transpose(3)] }
184
246
  end
185
247
  end
186
248
 
187
249
  describe "#map_events" do
188
250
  it "maps the Timeline in place" do
189
251
  mapped = timeline.map_events {|event| event.transpose(1) }
190
- mapped.should == { 0 => [note1.transpose(1)], 1=> [note1.transpose(1), note2.transpose(1)] }
252
+ mapped.should == { 0.0 => [note1.transpose(1)], 1.0 => [note1.transpose(1), note2.transpose(1)] }
191
253
  end
192
254
 
193
255
  it "does not modify this Timeline" do
@@ -198,8 +260,8 @@ describe MTK::Timeline do
198
260
 
199
261
  describe "#map_events!" do
200
262
  it "maps the Timeline in place" do
201
- timeline.map_events! {|event| event.transpose(1) }
202
- timeline.should == { 0 => [note1.transpose(1)], 1=> [note1.transpose(1), note2.transpose(1)] }
263
+ timeline.map_events! {|event| event.transpose(1.0) }
264
+ timeline.should == { 0.0 => [note1.transpose(1)], 1.0 => [note1.transpose(1), note2.transpose(1)] }
203
265
  end
204
266
  end
205
267
 
@@ -294,13 +356,18 @@ describe MTK::Timeline do
294
356
  describe "#flatten" do
295
357
  it "flattens nested timelines so that all nested subtimes are converted to absolute times in a single timeline" do
296
358
  timeline[10] = Timeline.from_hash({ 0 => note2, 1 => note1 })
297
- timeline.flatten.should == timeline_hash.merge({ 10 => [note2], 11 => [note1] })
359
+ timeline.flatten.should == timeline_hash.merge({ 10.0 => [note2], 11.0 => [note1] })
298
360
  end
299
361
 
300
362
  it "handles nested timelines which have nested timelines inside of them" do
301
363
  nested = Timeline.from_hash({ 0 => note1 })
302
364
  timeline[10] = Timeline.from_hash({ 100 => nested })
303
- timeline.flatten.should == timeline_hash.merge({ 110 => [note1] })
365
+ timeline.flatten.should == timeline_hash.merge({ 110.0 => [note1] })
366
+ end
367
+
368
+ it "handles multiple nested timeslines at the same time point" do
369
+ timeline[10] = [Timeline.from_hash({ 0 => note2, 1 => note1 }), Timeline.from_hash({ 2 => note1, 3 => note2 })]
370
+ timeline.flatten.should == timeline_hash.merge({ 10.0 => [note2], 11.0 => [note1], 12.0 => [note1], 13.0 => [note2] })
304
371
  end
305
372
 
306
373
  it "returns a new Timeline" do
@@ -333,5 +400,31 @@ describe MTK::Timeline do
333
400
  Timeline.quantize_time(13,2.5).should == 12.5
334
401
  end
335
402
  end
403
+
404
+ describe "#to_s" do
405
+ it "has one line per time" do
406
+ timeline.to_s.split("\n").size.should == timeline.times.size
407
+ end
408
+
409
+ it "has a time => event_list mapping on each line" do
410
+ for line in timeline.to_s.split("\n")
411
+ line.should =~ /=>/
412
+ end
413
+ end
414
+
415
+ it "pretty prints the output by aligning all '=>' arrows" do
416
+ # alignment is only a factor when the times have different numbers of digits:
417
+ timeline = Timeline.new
418
+ timeline.add 0, note1
419
+ timeline.add 10, note1
420
+ timeline.add 1000, note1
421
+ lines = timeline.to_s.split("\n")
422
+ last = lines.pop
423
+ arrow_position = last =~ /=>/
424
+ for line in lines
425
+ (line =~ /=>/).should == arrow_position
426
+ end
427
+ end
428
+ end
336
429
  end
337
430
 
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe MTK::Variable do
4
+
5
+ def var(*args)
6
+ ::MTK::Variable.new(*args)
7
+ end
8
+
9
+ describe '#name' do
10
+ it 'is the name the variable was constructed with' do
11
+ var('$').name.should == '$'
12
+ var('$$').name.should == '$$'
13
+ end
14
+
15
+ it 'cannot be changed after the variable is created' do
16
+ lambda{ var('$').name = '$$$' }.should raise_error
17
+ end
18
+ end
19
+
20
+ describe '#value' do
21
+ it 'is the value the variable was constructed with' do
22
+ var(:name, :value).value.should == :value
23
+ end
24
+
25
+ it 'can be changed after the variable is created' do
26
+ v = var(:name, :value)
27
+ v.value = 'foo'
28
+ v.value.should == 'foo'
29
+ end
30
+ end
31
+
32
+ describe '#==' do
33
+ it "is true when two variables' names are equal" do
34
+ var('$').should == var('$')
35
+ end
36
+
37
+ it "is false when two variables' names are not equal" do
38
+ var('$').should_not == var('$$')
39
+ end
40
+ end
41
+
42
+ describe '#to_s' do
43
+ it "includes just the variable name when there's no value" do
44
+ var('$').to_s.should == 'MTK::Variable<$>'
45
+ end
46
+
47
+ it "includes just the variable name and value when there's a value" do
48
+ var('x',1).to_s.should == 'MTK::Variable<x=1>'
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,2 @@
1
+ at_exit { CoverMe.complete! }
2
+ require 'cover_me'
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,8 @@
1
+ $__RUNNING_RSPEC_TESTS__ = true
2
+
1
3
  require 'mtk'
2
4
  include MTK
5
+ include Constants
3
6
  include PitchClasses
4
7
  include Pitches
5
8
  include Intensities
metadata CHANGED
@@ -1,134 +1,231 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mtk
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
4
5
  prerelease:
5
- version: 0.0.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Adam Murray
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-07-09 00:00:00 Z
14
- dependencies: []
15
-
16
- description:
12
+ date: 2013-06-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: citrus
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '2.4'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '2.4'
30
+ - !ruby/object:Gem::Dependency
31
+ name: midilib
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '2.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '2.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: gamelan
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '0.3'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.3'
62
+ - !ruby/object:Gem::Dependency
63
+ name: unimidi
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0.3'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0.3'
78
+ description: A music library and domain-specific language for generating music via
79
+ MIDI.
17
80
  email: adam@compusition.com
18
- executables: []
19
-
81
+ executables:
82
+ - mtk
20
83
  extensions: []
21
-
22
84
  extra_rdoc_files: []
23
-
24
- files:
85
+ files:
25
86
  - Rakefile
87
+ - DEVELOPMENT_NOTES.md
26
88
  - INTRO.md
27
89
  - README.md
28
90
  - LICENSE.txt
29
91
  - .yardopts
30
- - lib/mtk/_constants/durations.rb
31
- - lib/mtk/_constants/intensities.rb
32
- - lib/mtk/_constants/intervals.rb
33
- - lib/mtk/_constants/pitch_classes.rb
34
- - lib/mtk/_constants/pitches.rb
35
- - lib/mtk/_numeric_extensions.rb
36
- - lib/mtk/event.rb
37
- - lib/mtk/helper/collection.rb
38
- - lib/mtk/helper/event_builder.rb
39
- - lib/mtk/helper/pseudo_constants.rb
40
- - lib/mtk/lang/grammar.rb
92
+ - bin/mtk
93
+ - examples/crescendo.rb
94
+ - examples/drum_pattern1.rb
95
+ - examples/dynamic_pattern.rb
96
+ - examples/gets_and_play.rb
97
+ - examples/notation.rb
98
+ - examples/play_midi.rb
99
+ - examples/print_midi.rb
100
+ - examples/random_tone_row.rb
101
+ - examples/syntax_to_midi.rb
102
+ - examples/test_output.rb
103
+ - examples/tone_row_melody.rb
104
+ - lib/mtk/chord.rb
105
+ - lib/mtk/constants/durations.rb
106
+ - lib/mtk/constants/intensities.rb
107
+ - lib/mtk/constants/intervals.rb
108
+ - lib/mtk/constants/pitch_classes.rb
109
+ - lib/mtk/constants/pitches.rb
110
+ - lib/mtk/duration.rb
111
+ - lib/mtk/events/event.rb
112
+ - lib/mtk/events/note.rb
113
+ - lib/mtk/events/parameter.rb
114
+ - lib/mtk/helpers/collection.rb
115
+ - lib/mtk/helpers/convert.rb
116
+ - lib/mtk/helpers/lilypond.rb
117
+ - lib/mtk/helpers/output_selector.rb
118
+ - lib/mtk/helpers/pitch_collection.rb
119
+ - lib/mtk/helpers/pseudo_constants.rb
120
+ - lib/mtk/intensity.rb
121
+ - lib/mtk/interval.rb
41
122
  - lib/mtk/lang/mtk_grammar.citrus
123
+ - lib/mtk/lang/parser.rb
124
+ - lib/mtk/melody.rb
125
+ - lib/mtk/midi/dls_synth_device.rb
126
+ - lib/mtk/midi/dls_synth_output.rb
42
127
  - lib/mtk/midi/file.rb
128
+ - lib/mtk/midi/input.rb
43
129
  - lib/mtk/midi/jsound_input.rb
44
130
  - lib/mtk/midi/jsound_output.rb
45
- - lib/mtk/note.rb
46
- - lib/mtk/pattern/abstract_pattern.rb
47
- - lib/mtk/pattern/choice.rb
48
- - lib/mtk/pattern/cycle.rb
49
- - lib/mtk/pattern/enumerator.rb
50
- - lib/mtk/pattern/function.rb
51
- - lib/mtk/pattern/lines.rb
52
- - lib/mtk/pattern/palindrome.rb
53
- - lib/mtk/pattern/sequence.rb
131
+ - lib/mtk/midi/output.rb
132
+ - lib/mtk/midi/unimidi_input.rb
133
+ - lib/mtk/midi/unimidi_output.rb
134
+ - lib/mtk/numeric_extensions.rb
135
+ - lib/mtk/patterns/chain.rb
136
+ - lib/mtk/patterns/choice.rb
137
+ - lib/mtk/patterns/cycle.rb
138
+ - lib/mtk/patterns/for_each.rb
139
+ - lib/mtk/patterns/function.rb
140
+ - lib/mtk/patterns/lines.rb
141
+ - lib/mtk/patterns/palindrome.rb
142
+ - lib/mtk/patterns/pattern.rb
143
+ - lib/mtk/patterns/sequence.rb
54
144
  - lib/mtk/pitch.rb
55
145
  - lib/mtk/pitch_class.rb
56
146
  - lib/mtk/pitch_class_set.rb
57
- - lib/mtk/pitch_set.rb
58
- - lib/mtk/sequencer/abstract_sequencer.rb
59
- - lib/mtk/sequencer/rhythmic_sequencer.rb
60
- - lib/mtk/sequencer/step_sequencer.rb
147
+ - lib/mtk/sequencers/event_builder.rb
148
+ - lib/mtk/sequencers/legato_sequencer.rb
149
+ - lib/mtk/sequencers/rhythmic_sequencer.rb
150
+ - lib/mtk/sequencers/sequencer.rb
151
+ - lib/mtk/sequencers/step_sequencer.rb
61
152
  - lib/mtk/timeline.rb
62
- - lib/mtk/transform/invertible.rb
63
- - lib/mtk/transform/mappable.rb
64
- - lib/mtk/transform/set_theory_operations.rb
65
- - lib/mtk/transform/transposable.rb
153
+ - lib/mtk/variable.rb
66
154
  - lib/mtk.rb
67
- - spec/mtk/_constants/durations_spec.rb
68
- - spec/mtk/_constants/intensities_spec.rb
69
- - spec/mtk/_constants/intervals_spec.rb
70
- - spec/mtk/_constants/pitch_classes_spec.rb
71
- - spec/mtk/_constants/pitches_spec.rb
72
- - spec/mtk/_numeric_extensions_spec.rb
73
- - spec/mtk/event_spec.rb
74
- - spec/mtk/helper/collection_spec.rb
75
- - spec/mtk/helper/event_builder_spec.rb
76
- - spec/mtk/helper/pseudo_constants_spec.rb
77
- - spec/mtk/lang/grammar_spec.rb
155
+ - spec/mtk/chord_spec.rb
156
+ - spec/mtk/constants/durations_spec.rb
157
+ - spec/mtk/constants/intensities_spec.rb
158
+ - spec/mtk/constants/intervals_spec.rb
159
+ - spec/mtk/constants/pitch_classes_spec.rb
160
+ - spec/mtk/constants/pitches_spec.rb
161
+ - spec/mtk/duration_spec.rb
162
+ - spec/mtk/events/event_spec.rb
163
+ - spec/mtk/events/note_spec.rb
164
+ - spec/mtk/events/parameter_spec.rb
165
+ - spec/mtk/helpers/collection_spec.rb
166
+ - spec/mtk/helpers/pseudo_constants_spec.rb
167
+ - spec/mtk/intensity_spec.rb
168
+ - spec/mtk/interval_spec.rb
169
+ - spec/mtk/lang/parser_spec.rb
170
+ - spec/mtk/melody_spec.rb
78
171
  - spec/mtk/midi/file_spec.rb
79
- - spec/mtk/note_spec.rb
80
- - spec/mtk/pattern/abstract_pattern_spec.rb
81
- - spec/mtk/pattern/choice_spec.rb
82
- - spec/mtk/pattern/cycle_spec.rb
83
- - spec/mtk/pattern/function_spec.rb
84
- - spec/mtk/pattern/lines_spec.rb
85
- - spec/mtk/pattern/note_cycle_spec.rb.bak
86
- - spec/mtk/pattern/palindrome_spec.rb
87
- - spec/mtk/pattern/pitch_cycle_spec.rb.bak
88
- - spec/mtk/pattern/pitch_sequence_spec.rb.bak
89
- - spec/mtk/pattern/sequence_spec.rb
172
+ - spec/mtk/midi/jsound_input_spec.rb
173
+ - spec/mtk/midi/jsound_output_spec.rb
174
+ - spec/mtk/midi/output_spec.rb
175
+ - spec/mtk/midi/unimidi_input_spec.rb
176
+ - spec/mtk/midi/unimidi_output_spec.rb
177
+ - spec/mtk/numeric_extensions_spec.rb
178
+ - spec/mtk/patterns/chain_spec.rb
179
+ - spec/mtk/patterns/choice_spec.rb
180
+ - spec/mtk/patterns/cycle_spec.rb
181
+ - spec/mtk/patterns/for_each_spec.rb
182
+ - spec/mtk/patterns/function_spec.rb
183
+ - spec/mtk/patterns/lines_spec.rb
184
+ - spec/mtk/patterns/palindrome_spec.rb
185
+ - spec/mtk/patterns/pattern_spec.rb
186
+ - spec/mtk/patterns/sequence_spec.rb
90
187
  - spec/mtk/pitch_class_set_spec.rb
91
188
  - spec/mtk/pitch_class_spec.rb
92
- - spec/mtk/pitch_set_spec.rb
93
189
  - spec/mtk/pitch_spec.rb
94
- - spec/mtk/sequencer/abstract_sequencer_spec.rb
95
- - spec/mtk/sequencer/rhythmic_sequencer_spec.rb
96
- - spec/mtk/sequencer/step_sequencer_spec.rb
190
+ - spec/mtk/sequencers/event_builder_spec.rb
191
+ - spec/mtk/sequencers/legato_sequencer_spec.rb
192
+ - spec/mtk/sequencers/rhythmic_sequencer_spec.rb
193
+ - spec/mtk/sequencers/sequencer_spec.rb
194
+ - spec/mtk/sequencers/step_sequencer_spec.rb
97
195
  - spec/mtk/timeline_spec.rb
196
+ - spec/mtk/variable_spec.rb
197
+ - spec/spec_coverage.rb
98
198
  - spec/spec_helper.rb
99
199
  - spec/test.mid
100
- - examples/crescendo.rb
101
- - examples/dynamic_pattern.rb
102
- - examples/play_midi.rb
103
- - examples/print_midi.rb
104
- - examples/random_tone_row.rb
105
- - examples/tone_row_melody.rb
106
200
  homepage: http://github.com/adamjmurray/mtk
107
201
  licenses: []
108
-
109
202
  post_install_message:
110
203
  rdoc_options: []
111
-
112
- require_paths:
204
+ require_paths:
113
205
  - lib
114
- required_ruby_version: !ruby/object:Gem::Requirement
206
+ required_ruby_version: !ruby/object:Gem::Requirement
115
207
  none: false
116
- requirements:
117
- - - ">="
118
- - !ruby/object:Gem::Version
119
- version: "0"
120
- required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ! '>='
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ segments:
213
+ - 0
214
+ hash: 1581692375724578374
215
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
216
  none: false
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: "0"
217
+ requirements:
218
+ - - ! '>='
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ segments:
222
+ - 0
223
+ hash: 1581692375724578374
126
224
  requirements: []
127
-
128
225
  rubyforge_project:
129
- rubygems_version: 1.8.5
226
+ rubygems_version: 1.8.25
130
227
  signing_key:
131
228
  specification_version: 3
132
- summary: Music ToolKit for Ruby
229
+ summary: Music Tool Kit for Ruby
133
230
  test_files: []
134
-
231
+ has_rdoc: