mtk 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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,8 +1,8 @@
1
1
  module MTK
2
- module Sequencer
2
+ module Sequencers
3
3
 
4
4
  # A Sequencer which has a constant {#step_size} time between {Timeline} entries.
5
- class StepSequencer < AbstractSequencer
5
+ class StepSequencer < Sequencer
6
6
 
7
7
  # The time between entries in the {Timeline}.
8
8
  attr_accessor :step_size
@@ -15,8 +15,8 @@ module MTK
15
15
  ########################
16
16
  protected
17
17
 
18
- # (see AbstractSequencer#advance!)
19
- def advance!
18
+ # (see Sequencer#advance)
19
+ def advance
20
20
  @time += @step_size
21
21
  end
22
22
 
data/lib/mtk/timeline.rb CHANGED
@@ -2,13 +2,12 @@ module MTK
2
2
 
3
3
  # A collection of timed events. The core data structure used to interface with input and output.
4
4
  #
5
- # Maps sorted times to lists of events.
5
+ # Maps sorted floating point times to lists of events.
6
6
  #
7
7
  # Enumerable as [time,event_list] pairs.
8
8
  #
9
9
  class Timeline
10
-
11
- include Transform::Mappable
10
+ include Enumerable
12
11
 
13
12
  def initialize()
14
13
  @timeline = {}
@@ -22,7 +21,7 @@ module MTK
22
21
  end
23
22
 
24
23
  def merge enumerable
25
- for time,events in enumerable
24
+ enumerable.each do |time,events|
26
25
  add(time,events)
27
26
  end
28
27
  self
@@ -43,23 +42,23 @@ module MTK
43
42
  end
44
43
 
45
44
  def [](time)
46
- @timeline[time]
45
+ @timeline[time.to_f]
47
46
  end
48
47
 
49
48
  def []=(time, events)
50
49
  time = time.to_f unless time.is_a? Numeric
51
50
  case events
52
51
  when nil?
53
- @timeline.delete time
52
+ @timeline.delete time.to_f
54
53
  when Array
55
- @timeline[time] = events
54
+ @timeline[time.to_f] = events
56
55
  else
57
- @timeline[time] = [events]
56
+ @timeline[time.to_f] = [events]
58
57
  end
59
58
  end
60
59
 
61
60
  def add(time, event)
62
- events = @timeline[time]
61
+ events = @timeline[time.to_f]
63
62
  if events
64
63
  if event.is_a? Array
65
64
  events.concat event
@@ -72,17 +71,23 @@ module MTK
72
71
  end
73
72
 
74
73
  def delete(time)
75
- @timeline.delete(time)
74
+ @timeline.delete(time.to_f)
76
75
  end
77
76
 
78
77
  def has_time? time
79
- @timeline.has_key? time
78
+ @timeline.has_key? time.to_f
80
79
  end
81
80
 
82
81
  def times
83
82
  @timeline.keys.sort
84
83
  end
85
84
 
85
+ def length
86
+ last_time = times.last
87
+ events = @timeline[last_time]
88
+ last_time + events.map{|event| event.duration }.max
89
+ end
90
+
86
91
  def empty?
87
92
  @timeline.empty?
88
93
  end
@@ -93,15 +98,24 @@ module MTK
93
98
 
94
99
  def each
95
100
  # this is similar to @timeline.each, but by iterating over #times, we yield the events in chronological order
96
- for time in times
97
- yield time,@timeline[time]
101
+ times.each do |time|
102
+ yield time, @timeline[time]
98
103
  end
99
104
  end
100
105
 
106
+ # the original Enumerable#map implementation, which returns an Array
107
+ alias enumerable_map map
108
+
109
+ # Constructs a new Timeline by mapping each [time,event_list] pair
110
+ # @see #map!
111
+ def map &block
112
+ self.class.from_a enumerable_map(&block)
113
+ end
114
+
115
+ # Perform #map in place
116
+ # @see #map
101
117
  def map! &block
102
- # we use the enumerable_map that aliased by the Mappable module,
103
- # because Mappable#map will create an extra timeline instance, which is unnecessary in this case
104
- mapped = enumerable_map &block
118
+ mapped = enumerable_map(&block)
105
119
  clear
106
120
  merge mapped
107
121
  end
@@ -109,7 +123,7 @@ module MTK
109
123
  # Map every individual event, without regard for the time at which is occurs
110
124
  def map_events
111
125
  mapped_timeline = Timeline.new
112
- for time,events in self
126
+ self.each do |time,events|
113
127
  mapped_timeline[time] = events.map{|event| yield event }
114
128
  end
115
129
  mapped_timeline
@@ -117,7 +131,7 @@ module MTK
117
131
 
118
132
  # Map every individual event in place, without regard for the time at which is occurs
119
133
  def map_events!
120
- for time,events in self
134
+ each do |time,events|
121
135
  self[time] = events.map{|event| yield event }
122
136
  end
123
137
  end
@@ -132,10 +146,10 @@ module MTK
132
146
 
133
147
  def flatten
134
148
  flattened = Timeline.new
135
- for time,events in self
136
- for event in events
149
+ self.each do |time,events|
150
+ events.each do |event|
137
151
  if event.is_a? Timeline
138
- for subtime,subevent in event.flatten
152
+ event.flatten.each do |subtime,subevent|
139
153
  flattened.add(time+subtime, subevent)
140
154
  end
141
155
  else
@@ -195,7 +209,10 @@ module MTK
195
209
  end
196
210
 
197
211
  def to_s
198
- times.map{|t| "#{t} => #{@timeline[t].join ', '}" }.join "\n"
212
+ times = self.times
213
+ last = times.last
214
+ width = sprintf("%d",last).length + 3 # nicely align the '=>' against the longest number
215
+ times.map{|t| sprintf("%#{width}.2f",t)+" => #{@timeline[t].join ', '}" }.join "\n"
199
216
  end
200
217
 
201
218
  def inspect
@@ -0,0 +1,32 @@
1
+ module MTK
2
+
3
+ # A placeholder element for a variable value, for use within a {Patterns::Pattern} such as a {Patterns::ForEach} pattern.
4
+ # Will be evaluated to an actual value by the Pattern or Sequencer
5
+ #
6
+ class Variable
7
+
8
+ attr_reader :name
9
+
10
+ attr_accessor :value
11
+
12
+ def initialize name, value=nil
13
+ @name = name
14
+ @value = value
15
+ @implicit = !!(name =~ /^\$+$/)
16
+ end
17
+
18
+ # @return true when this variable has no specific value and references the implicit variable stack (such as in a {Patterns::ForEach})
19
+ def implicit?
20
+ @implicit
21
+ end
22
+
23
+ def == other
24
+ other.is_a? self.class and other.name == self.name
25
+ end
26
+
27
+ def to_s
28
+ "#{self.class}<#{name}#{'='+value.to_s if value}>"
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe MTK::Chord do
4
+
5
+ let(:c_major) { Chord.new([C4,E4,G4]) }
6
+
7
+ describe ".new" do
8
+ it "removes duplicates" do
9
+ Chord.new([C4, E4, G4, C4]).pitches.should == [C4, E4, G4]
10
+ end
11
+
12
+ it "sorts the pitches" do
13
+ Chord.new([F4, G4, E4, D4, C4]).pitches.should == [C4, D4, E4, F4, G4]
14
+ end
15
+ end
16
+
17
+ describe '#inversion' do
18
+ it "adds an octave to the chord's pitches starting from the lowest, for each whole number in a postive argument" do
19
+ c_major.inversion(2).should == Chord.new([G4,C5,E5])
20
+ end
21
+
22
+ it "subtracts an octave to the chord's pitches starting fromt he highest, for each whole number in a negative argument" do
23
+ c_major.inversion(-2).should == Chord.new([E3,G3,C4])
24
+ end
25
+
26
+ it "wraps around to the lowest pitch when the argument is bigger than the number of pitches in the chord (positive argument)" do
27
+ c_major.inversion(4).should == Chord.new([E5,G5,C6])
28
+ end
29
+
30
+ it "wraps around to the highest pitch when the magnitude of the argument is bigger than the number of pitches in the chord (negative argument)" do
31
+ c_major.inversion(-4).should == Chord.new([G2,C3,E3])
32
+ end
33
+ end
34
+
35
+ describe "#nearest" do
36
+ it "returns the nearest Melody where the first Pitch has the given PitchClass" do
37
+ c_major.nearest(F).should == c_major.transpose(5)
38
+ c_major.nearest(G).should == c_major.transpose(-5)
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ describe MTK do
45
+
46
+ describe '#Chord' do
47
+
48
+ it "acts like new for a single Array argument" do
49
+ Chord([C4,D4]).should == Chord.new([C4,D4])
50
+ end
51
+
52
+ it "acts like new for multiple arguments, by treating them like an Array (splat)" do
53
+ Chord(C4,D4).should == Chord.new([C4,D4])
54
+ end
55
+
56
+ it "handles an Array with elements that can be converted to Pitches" do
57
+ Chord(['C4','D4']).should == Chord.new([C4,D4])
58
+ end
59
+
60
+ it "handles multiple arguments that can be converted to a Pitch" do
61
+ Chord(:C4,:D4).should == Chord.new([C4,D4])
62
+ end
63
+
64
+ it "handles a single Pitch" do
65
+ Chord(C4).should == Chord.new([C4])
66
+ end
67
+
68
+ it "handles single elements that can be converted to a Pitch" do
69
+ Chord('C4').should == Chord.new([C4])
70
+ end
71
+
72
+ it "returns the argument if it's already a Chord" do
73
+ pitch_set = Chord.new([C4,D4,D4])
74
+ Chord(pitch_set).should == Chord.new([C4,D4])
75
+ end
76
+
77
+ it "raises an error for types it doesn't understand" do
78
+ lambda{ Chord({:not => :compatible}) }.should raise_error
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe MTK::Durations do
3
+ describe MTK::Constants::Durations do
4
4
 
5
5
  describe 'w' do
6
6
  it 'is 4 beats' do
7
- w.should == 4
7
+ w.value.should == 4
8
8
  end
9
9
  it 'is available via a module property and via mixin' do
10
10
  Durations::w.should == w
@@ -13,7 +13,7 @@ describe MTK::Durations do
13
13
 
14
14
  describe 'h' do
15
15
  it 'is 2 beats' do
16
- h.should == 2
16
+ h.value.should == 2
17
17
  end
18
18
  it 'is available via a module property and via mixin' do
19
19
  Durations::h.should == h
@@ -22,25 +22,25 @@ describe MTK::Durations do
22
22
 
23
23
  describe 'q' do
24
24
  it 'is 1 beat' do
25
- q.round.should == 1
25
+ q.value.should == 1
26
26
  end
27
27
  it 'is available via a module property and via mixin' do
28
28
  Durations::q.should == q
29
29
  end
30
30
  end
31
31
 
32
- describe 'e' do
32
+ describe 'i' do
33
33
  it 'is 1/2 of a beat' do
34
- e.should == 1.0/2
34
+ i.value.should == 1.0/2
35
35
  end
36
36
  it 'is available via a module property and via mixin' do
37
- Durations::e.should == e
37
+ Durations::i.should == i
38
38
  end
39
39
  end
40
40
 
41
41
  describe 's' do
42
42
  it 'is 1/4 of a beat' do
43
- s.should == 1.0/4
43
+ s.value.should == 1.0/4
44
44
  end
45
45
  it 'is available via a module property and via mixin' do
46
46
  Durations::s.should == s
@@ -49,7 +49,7 @@ describe MTK::Durations do
49
49
 
50
50
  describe 'r' do
51
51
  it 'is 1/8 of a beat' do
52
- r.should == 1.0/8
52
+ r.value.should == 1.0/8
53
53
  end
54
54
  it 'is available via a module property and via mixin' do
55
55
  Durations::r.should == r
@@ -58,7 +58,7 @@ describe MTK::Durations do
58
58
 
59
59
  describe 'x' do
60
60
  it 'is 1/16 of a beat' do
61
- x.should == 1.0/16
61
+ x.value.should == 1.0/16
62
62
  end
63
63
  it 'is available via a module property and via mixin' do
64
64
  Durations::x.should == x
@@ -67,7 +67,7 @@ describe MTK::Durations do
67
67
 
68
68
  describe "DURATIONS" do
69
69
  it "contains all Durations pseudo-constants" do
70
- Durations::DURATIONS.should =~ [w, h, q, e, s, r, x]
70
+ Durations::DURATIONS.should =~ [w, h, q, i, s, r, x]
71
71
  end
72
72
 
73
73
  it "is immutable" do
@@ -77,7 +77,7 @@ describe MTK::Durations do
77
77
 
78
78
  describe "DURATION_NAMES" do
79
79
  it "contains all Durations pseudo-constants names as strings" do
80
- Durations::DURATION_NAMES.should =~ ['w', 'h', 'q', 'e', 's', 'r', 'x']
80
+ Durations::DURATION_NAMES.should =~ ['w', 'h', 'q', 'i', 's', 'r', 'x']
81
81
  end
82
82
 
83
83
  it "is immutable" do
@@ -85,34 +85,5 @@ describe MTK::Durations do
85
85
  end
86
86
  end
87
87
 
88
- describe ".[]" do
89
- it "looks up the constant by name" do
90
- for duration in Durations::DURATION_NAMES
91
- Durations[duration].should == Durations.send(duration)
92
- end
93
- end
94
-
95
- it "supports a '.' suffix, which multiples the value by 1.5" do
96
- for duration in Durations::DURATION_NAMES
97
- Durations["#{duration}."].should == Durations.send(duration) * 1.5
98
- end
99
- end
100
-
101
- it "supports a 't' suffix, which multiples the value by 2/3" do
102
- for duration in Durations::DURATION_NAMES
103
- Durations["#{duration}t"].should == Durations.send(duration) * 2/3.0
104
- end
105
- end
106
-
107
- it "supports '.' and 't' suffixes in any combination" do
108
- for duration in Durations::DURATION_NAMES
109
- Durations["#{duration}.t"].should == Durations.send(duration) * 1.5 * 2/3.0
110
- Durations["#{duration}t."].should == Durations.send(duration) * 1.5 * 2/3.0
111
- Durations["#{duration}.."].should == Durations.send(duration) * 1.5 * 1.5
112
- Durations["#{duration}..t.t."].should == Durations.send(duration) * 1.5**4 * (2/3.0)**2
113
- end
114
- end
115
- end
116
-
117
88
  end
118
89
 
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe MTK::Intensities do
3
+ describe MTK::Constants::Intensities do
4
4
 
5
5
  describe 'ppp' do
6
6
  it 'is equivalent to MIDI velocity 16' do
7
- (ppp * 127).round.should == 16
7
+ (ppp.value * 127).round.should == 16
8
8
  end
9
9
  it 'is available via a module property and via mixin' do
10
10
  Intensities::ppp.should == ppp
@@ -13,7 +13,7 @@ describe MTK::Intensities do
13
13
 
14
14
  describe 'pp' do
15
15
  it 'is equivalent to MIDI velocity 32' do
16
- (pp * 127).round.should == 32
16
+ (pp.value * 127).round.should == 32
17
17
  end
18
18
  it 'is available via a module property and via mixin' do
19
19
  Intensities::pp.should == pp
@@ -22,7 +22,7 @@ describe MTK::Intensities do
22
22
 
23
23
  describe 'p' do
24
24
  it 'is equivalent to MIDI velocity 48' do
25
- (p * 127).round.should == 48
25
+ (p.value * 127).round.should == 48
26
26
  end
27
27
  it 'is available via a module property and via mixin' do
28
28
  Intensities::p.should == p
@@ -31,7 +31,7 @@ describe MTK::Intensities do
31
31
 
32
32
  describe 'mp' do
33
33
  it 'is equivalent to MIDI velocity 64' do
34
- (mp * 127).round.should == 64
34
+ (mp.value * 127).round.should == 64
35
35
  end
36
36
  it 'is available via a module property and via mixin' do
37
37
  Intensities::mp.should == mp
@@ -40,19 +40,19 @@ describe MTK::Intensities do
40
40
 
41
41
  describe 'mf' do
42
42
  it 'is equivalent to MIDI velocity 79' do
43
- (mf * 127).round.should == 79
43
+ (mf.value * 127).round.should == 79
44
44
  end
45
45
  it 'is available via a module property and via mixin' do
46
46
  Intensities::mf.should == mf
47
47
  end
48
48
  end
49
49
 
50
- describe 'f' do
50
+ describe 'o' do # AKA forte
51
51
  it 'is equivalent to MIDI velocity 95' do
52
- (f * 127).round.should == 95
52
+ (o.value * 127).round.should == 95
53
53
  end
54
54
  it 'is available via a module property and via mixin' do
55
- Intensities::f.should == f
55
+ Intensities::o.should == o
56
56
  end
57
57
  it "does not overwrite the PitchClass constant 'F'" do
58
58
  F.should be_a PitchClass
@@ -61,7 +61,7 @@ describe MTK::Intensities do
61
61
 
62
62
  describe 'ff' do
63
63
  it 'is equivalent to MIDI velocity 111' do
64
- (ff * 127).round.should == 111
64
+ (ff.value * 127).round.should == 111
65
65
  end
66
66
  it 'is available via a module property and via mixin' do
67
67
  Intensities::ff.should == ff
@@ -70,7 +70,7 @@ describe MTK::Intensities do
70
70
 
71
71
  describe 'fff' do
72
72
  it 'is equivalent to MIDI velocity 127' do
73
- (fff * 127).round.should == 127
73
+ (fff.value * 127).round.should == 127
74
74
  end
75
75
  it 'is available via a module property and via mixin' do
76
76
  Intensities::fff.should == fff
@@ -79,7 +79,7 @@ describe MTK::Intensities do
79
79
 
80
80
  describe "INTENSITIES" do
81
81
  it "contains all Intensities pseudo-constants" do
82
- Intensities::INTENSITIES.should =~ [ppp, pp, p, mp, mf, f, ff, fff]
82
+ Intensities::INTENSITIES.should =~ [ppp, pp, p, mp, mf, o, ff, fff]
83
83
  end
84
84
 
85
85
  it "is immutable" do
@@ -89,7 +89,7 @@ describe MTK::Intensities do
89
89
 
90
90
  describe "INTENSITY_NAMES" do
91
91
  it "contains all Intensities pseudo-constants names as strings" do
92
- Intensities::INTENSITY_NAMES.should =~ ['ppp', 'pp', 'p', 'mp', 'mf', 'f', 'ff', 'fff']
92
+ Intensities::INTENSITY_NAMES.should =~ ['ppp', 'pp', 'p', 'mp', 'mf', 'o', 'ff', 'fff']
93
93
  end
94
94
 
95
95
  it "is immutable" do
@@ -97,29 +97,5 @@ describe MTK::Intensities do
97
97
  end
98
98
  end
99
99
 
100
- describe ".[]" do
101
- it "looks up the constant by name" do
102
- for name in INTENSITY_NAMES
103
- Intensities[name].should == Intensities.send(name)
104
- end
105
- end
106
-
107
- it "adds 1.0/24 when the name ends with '+', except for 'fff+' which is 1.0 like 'fff'" do
108
- for name in INTENSITY_NAMES
109
- if name == 'fff'
110
- Intensities["#{name}+"].should == 1.0
111
- else
112
- Intensities["#{name}+"].should == Intensities.send(name)+1.0/24
113
- end
114
- end
115
- end
116
-
117
- it "subtracts 1.0/24 when the name ends with '-'" do
118
- for name in INTENSITY_NAMES
119
- Intensities["#{name}-"].should == Intensities.send(name)-1.0/24
120
- end
121
- end
122
- end
123
-
124
100
  end
125
101