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
data/lib/mtk.rb CHANGED
@@ -1,70 +1,82 @@
1
- ##############################################
2
1
  # Description of modules for documentation:
3
2
 
4
3
  # The top level module for this library
5
4
  module MTK
6
5
 
6
+ # Constants for modeling frequency, intensity, and duration.
7
+ module Constants
8
+ end
9
+
7
10
  # Internal helper classes used to avoid duplicating code in this library.
8
- module Helper
11
+ module Helpers
9
12
  end
10
13
 
11
- # Classes that emit elements one at a time. Used by {Sequencer}s to construct {Timeline}s.
12
- #
13
- # The core interface for Pattern classes is {Pattern::Enumerator#next} and {Pattern::Enumerator#rewind}.
14
- module Pattern
14
+ # Musical events, such as {Events::Note}s and {Events::Parameter} changes, that are arranged in time via a {Timeline}.
15
+ module Events
15
16
  end
16
17
 
17
- # Classes that assemble {Pattern}s into {Timeline}s.
18
- module Sequencer
18
+ # Classes that emit elements one at a time. Used by {MTK::Sequencers::Sequencer}s to construct {Timeline}s.
19
+ module Patterns
20
+ end
21
+
22
+ # Classes that assemble {Patterns::Pattern}s into {Timeline}s.
23
+ module Sequencers
19
24
  end
20
25
 
21
26
  # Optional classes for the "MTK language", which let's you compose music via MTK without writing any Ruby code
22
27
  module Lang
23
28
  end
24
29
 
25
- # Optional classes for MIDI input and output.
30
+ # Optional classes for MIDI input and {Output}.
26
31
  module MIDI
27
32
  end
28
33
 
29
34
  end
30
35
 
31
- require 'mtk/helper/collection'
32
- require 'mtk/helper/pseudo_constants'
33
-
34
- require 'mtk/transform/mappable'
35
- require 'mtk/transform/transposable'
36
- require 'mtk/transform/invertible'
37
- require 'mtk/transform/set_theory_operations'
38
-
39
36
  require 'mtk/pitch_class'
40
- require 'mtk/pitch_class_set'
41
37
  require 'mtk/pitch'
42
- require 'mtk/pitch_set'
38
+ require 'mtk/duration'
39
+ require 'mtk/intensity'
43
40
 
44
- require 'mtk/event'
45
- require 'mtk/note'
46
- require 'mtk/timeline'
41
+ require 'mtk/interval'
47
42
 
48
- require 'mtk/_constants/pitch_classes'
49
- require 'mtk/_constants/pitches'
50
- require 'mtk/_constants/intervals'
51
- require 'mtk/_constants/intensities'
52
- require 'mtk/_constants/durations'
43
+ require 'mtk/variable'
53
44
 
54
- require 'mtk/pattern/enumerator'
55
- require 'mtk/pattern/abstract_pattern'
56
- require 'mtk/pattern/sequence'
57
- require 'mtk/pattern/cycle'
58
- require 'mtk/pattern/choice'
59
- require 'mtk/pattern/function'
60
- require 'mtk/pattern/lines'
61
- require 'mtk/pattern/palindrome'
45
+ require 'mtk/helpers/collection'
46
+ require 'mtk/helpers/pitch_collection'
47
+ require 'mtk/helpers/pseudo_constants'
48
+ require 'mtk/helpers/convert'
62
49
 
63
- require 'mtk/helper/event_builder'
64
- require 'mtk/sequencer/abstract_sequencer'
65
- require 'mtk/sequencer/step_sequencer'
66
- require 'mtk/sequencer/rhythmic_sequencer'
50
+ require 'mtk/pitch_class_set'
51
+ require 'mtk/melody'
52
+ require 'mtk/chord'
67
53
 
68
- require 'mtk/_numeric_extensions'
54
+ require 'mtk/events/event'
55
+ require 'mtk/events/note'
56
+ require 'mtk/events/parameter'
69
57
 
58
+ require 'mtk/timeline'
70
59
 
60
+ require 'mtk/constants/pitch_classes'
61
+ require 'mtk/constants/pitches'
62
+ require 'mtk/constants/intervals'
63
+ require 'mtk/constants/intensities'
64
+ require 'mtk/constants/durations'
65
+
66
+ require 'mtk/patterns/pattern'
67
+ require 'mtk/patterns/sequence'
68
+ require 'mtk/patterns/cycle'
69
+ require 'mtk/patterns/choice'
70
+ require 'mtk/patterns/function'
71
+ require 'mtk/patterns/lines'
72
+ require 'mtk/patterns/palindrome'
73
+ require 'mtk/patterns/chain'
74
+ require 'mtk/patterns/for_each'
75
+
76
+ require 'mtk/sequencers/event_builder'
77
+ require 'mtk/sequencers/sequencer'
78
+ require 'mtk/sequencers/step_sequencer'
79
+ require 'mtk/sequencers/rhythmic_sequencer'
80
+ require 'mtk/sequencers/legato_sequencer'
81
+
82
+ require 'mtk/lang/parser'
data/lib/mtk/chord.rb ADDED
@@ -0,0 +1,55 @@
1
+ module MTK
2
+
3
+ # A sorted collection of distinct {Pitch}es.
4
+ #
5
+ # The "vertical" (simultaneous) pitch collection.
6
+ #
7
+ # @see Melody
8
+ # @see PitchClassSet
9
+ #
10
+ class Chord < Melody
11
+
12
+ # @param pitches [#to_a] the collection of pitches
13
+ # @note duplicate pitches will be removed. See #{Melody} if you want to maintain duplicates.
14
+ # @see MTK#Chord
15
+ #
16
+ def initialize(pitches)
17
+ pitches = pitches.to_a.clone
18
+ pitches.uniq!
19
+ pitches.sort!
20
+ @pitches = pitches.freeze
21
+ end
22
+
23
+ # Generate a chord inversion (positive numbers move the lowest notes up an octave, negative moves the highest notes down)
24
+ def inversion(number)
25
+ number = number.to_i
26
+ pitch_set = Array.new(@pitches.uniq.sort)
27
+ if number > 0
28
+ number.times do |count|
29
+ index = count % pitch_set.length
30
+ pitch_set[index] += 12
31
+ end
32
+ else
33
+ number.abs.times do |count|
34
+ index = -(count + 1) % pitch_set.length # count from -1 downward to go backwards through the list starting at the end
35
+ pitch_set[index] -= 12
36
+ end
37
+ end
38
+ self.class.new pitch_set.sort
39
+ end
40
+
41
+ # Transpose the chord so that it's lowest pitch is the given pitch class.
42
+ def nearest(pitch_class)
43
+ self.transpose @pitches.first.pitch_class.distance_to(pitch_class)
44
+ end
45
+ end
46
+
47
+ # Construct an ordered {Melody} with no duplicates.
48
+ # @see #Chord
49
+ # @see #Melody
50
+ def Chord(*anything)
51
+ Chord.new Helpers::Convert.to_pitches(*anything)
52
+ end
53
+ module_function :Chord
54
+
55
+ end
@@ -0,0 +1,57 @@
1
+ require 'rational'
2
+
3
+ module MTK
4
+ module Constants
5
+
6
+ # Defines duration constants using abbreviations for standard rhythm values ('w' for whole note, 'h' for half note, etc).
7
+ #
8
+ # In order to avoid conflict with pitch class 'e', the constant for eighth note is 'i'
9
+ #
10
+ # These can be thought of like constants, but they
11
+ # use lower-case names and therefore define them as "pseudo constant" methods.
12
+ # The methods are available either through the module (MTK::Durations::e) or via mixin (include MTK::Durations; q)
13
+ #
14
+ # These values assume the quarter note is one beat (1.0), so they work best with 4/4 and other */4 time signatures.
15
+ #
16
+ # @note Including this module defines a bunch of single-character variables, which may shadow existing variable names.
17
+ # Just be mindful of what is defined in this module when including it.
18
+ #
19
+ # @see Note
20
+ module Durations
21
+ extend Helpers::PseudoConstants
22
+
23
+ # NOTE: the yard doc macros here only fill in [$2] with the actual value when generating docs under Ruby 1.9+
24
+
25
+ # whole note
26
+ # @macro [attach] durations.define_constant
27
+ # @attribute [r]
28
+ # @return [$2] number of beats for $1
29
+ define_constant 'w', MTK::Duration[4]
30
+
31
+ # half note
32
+ define_constant 'h', MTK::Duration[2]
33
+
34
+ # quarter note
35
+ define_constant 'q', MTK::Duration[1]
36
+
37
+ # eight note
38
+ define_constant 'i', MTK::Duration[Rational(1,2)]
39
+
40
+ # sixteenth note
41
+ define_constant 's', MTK::Duration[Rational(1,4)]
42
+
43
+ # thirty-second note
44
+ define_constant 'r', MTK::Duration[Rational(1,8)]
45
+
46
+ # sixty-fourth note
47
+ define_constant 'x', MTK::Duration[Rational(1,16)]
48
+
49
+ # The values of all "psuedo constants" defined in this module
50
+ DURATIONS = [w, h, q, i, s, r, x].freeze
51
+
52
+ # The names of all "psuedo constants" defined in this module
53
+ DURATION_NAMES = MTK::Duration::NAMES
54
+
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,61 @@
1
+ module MTK
2
+ module Constants
3
+
4
+ # Defines intensity constants using standard dynamic symbols.
5
+ #
6
+ # These can be thought of like constants, but in order to distinguish 'f' (forte) from the {PitchClass} 'F'
7
+ # it was necessary to use lower-case names and therefore define them as "pseudo constant" methods.
8
+ # The methods are available either through the module (MTK::Intensities::f) or via mixin (include MTK::Intensities; f)
9
+ #
10
+ # These values are intensities in the range 0.125 - 1.0 (in increments of 1/8), so they can be easily scaled (unlike MIDI velocities).
11
+ #
12
+ # It is also possible to retrieve values in increments of 1/24 by using the '+' and '-' suffix when looking
13
+ # up values via the {.[]} method.
14
+ #
15
+ # @note Including this module shadows Ruby's built-in p() method.
16
+ # If you include this module, you can access the built-in p() method via Kernel.p()
17
+ #
18
+ # @see Note
19
+ module Intensities
20
+ extend Helpers::PseudoConstants
21
+
22
+ # NOTE: the yard doc macros here only fill in [$2] with the actual value when generating docs under Ruby 1.9+
23
+
24
+ # pianississimo
25
+ # @macro [attach] intensities.define_constant
26
+ # @attribute [r]
27
+ # @return [$2] intensity value for $1
28
+ define_constant 'ppp', MTK::Intensity[0.125]
29
+
30
+ # pianissimo
31
+ define_constant 'pp', MTK::Intensity[0.25]
32
+
33
+ # piano
34
+ # @note Including this module shadows Ruby's built-in p() method.
35
+ # If you include this module, you can access the built-in p() method via Kernel.p()
36
+ define_constant 'p', MTK::Intensity[0.375]
37
+
38
+ # mezzo-piano
39
+ define_constant 'mp', MTK::Intensity[0.5]
40
+
41
+ # mezzo-forte
42
+ define_constant 'mf', MTK::Intensity[0.625]
43
+
44
+ # forte
45
+ define_constant 'o', MTK::Intensity[0.75]
46
+
47
+ # fortissimo
48
+ define_constant 'ff', MTK::Intensity[0.875]
49
+
50
+ # fortississimo
51
+ define_constant 'fff', MTK::Intensity[1.0]
52
+
53
+ # The values of all "psuedo constants" defined in this module
54
+ INTENSITIES = [ppp, pp, p, mp, mf, o, ff, fff].freeze
55
+
56
+ # The names of all "psuedo constants" defined in this module
57
+ INTENSITY_NAMES = MTK::Intensity::NAMES
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,73 @@
1
+ module MTK
2
+ module Constants
3
+
4
+ # Defines a constant for intervals up to an octave using diatonic naming conventions (see http://en.wikipedia.org/wiki/Interval_(music)#Main_intervals)
5
+ #
6
+ # Naming conventions
7
+ # P#: perfect interval
8
+ # M#: major interval
9
+ # m#: minor interval
10
+ # TT: tritone (AKA augmented 4th or diminished 5th)
11
+ #
12
+ # These can be thought of like constants, but in order to succinctly distinguish 'm2' (minor) from 'M2' (major),
13
+ # it was necessary to use lower-case names for some of the values and therefore define them as "pseudo constant" methods.
14
+ # The methods are available either through the module (MTK::Intervals::m2) or via mixin (include MTK::Intervals; m2)
15
+ module Intervals
16
+ extend Helpers::PseudoConstants
17
+
18
+ # NOTE: the yard doc macros here only fill in [$2] with the actual value when generating docs under Ruby 1.9+
19
+
20
+ # perfect unison
21
+ # @macro [attach] interval.define_constant
22
+ # @attribute [r]
23
+ # @return [$2] number of semitones in the interval $1
24
+ define_constant 'P1', MTK::Interval[0]
25
+
26
+ # minor second
27
+ # @macro [attach] interval.define_constant
28
+ # @attribute [r]
29
+ # @return [$2] number of semitones in the interval $1
30
+ define_constant 'm2', MTK::Interval[1]
31
+
32
+ # major second
33
+ define_constant 'M2', MTK::Interval[2]
34
+
35
+ # minor third
36
+ define_constant 'm3', MTK::Interval[3]
37
+
38
+ # major third
39
+ define_constant 'M3', MTK::Interval[4]
40
+
41
+ # pefect fourth
42
+ define_constant 'P4', MTK::Interval[5]
43
+
44
+ # tritone (AKA augmented fourth or diminished fifth)
45
+ define_constant 'TT', MTK::Interval[6]
46
+
47
+ # perfect fifth
48
+ define_constant 'P5', MTK::Interval[7]
49
+
50
+ # minor sixth
51
+ define_constant 'm6', MTK::Interval[8]
52
+
53
+ # major sixth
54
+ define_constant 'M6', MTK::Interval[9]
55
+
56
+ # minor seventh
57
+ define_constant 'm7', MTK::Interval[10]
58
+
59
+ # major seventh
60
+ define_constant 'M7', MTK::Interval[11]
61
+
62
+ # pefect octave
63
+ define_constant 'P8', MTK::Interval[12]
64
+
65
+ # The values of all "psuedo constants" defined in this module
66
+ INTERVALS = [P1, m2, M2, m3, M3, P4, TT, P5, m6, M6, m7, M7, P8].freeze
67
+
68
+ # The names of all "psuedo constants" defined in this module
69
+ INTERVAL_NAMES = MTK::Interval::NAMES
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,29 @@
1
+ module MTK
2
+ module Constants
3
+
4
+ # Defines a constant for each {PitchClass} in the Western chromatic scale.
5
+ module PitchClasses
6
+
7
+ # The values of all constants defined in this module
8
+ PITCH_CLASSES = MTK::PitchClass::PITCH_CLASSES
9
+
10
+ # The names of all constants defined in this module
11
+ PITCH_CLASS_NAMES = MTK::PitchClass::NAMES
12
+
13
+ PITCH_CLASSES.each { |pc| const_set pc.name, pc }
14
+
15
+ # Lookup the value of an pitch class constant by name.
16
+ # @example lookup value of 'C'
17
+ # MTK::PitchClasses['C']
18
+ # @see PitchClass.[]
19
+ def self.[](name)
20
+ begin
21
+ const_get name
22
+ rescue
23
+ nil
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,52 @@
1
+ module MTK
2
+ module Constants
3
+
4
+ # Defines a constants for each {Pitch} in the standard MIDI range using scientific pitch notation.
5
+ #
6
+ # See http://en.wikipedia.org/wiki/Scientific_pitch_notation
7
+ #
8
+ # @note Because the character '#' cannot be used in the name of a constant,
9
+ # the "black key" pitches are all named as flats with 'b' (for example, Gb3 or Cb4)
10
+ # @note Because the character '-' (minus) cannot be used in the name of a constant,
11
+ # the low pitches use '_' (underscore) in place of '-' (minus) (for example C_1).
12
+ module Pitches
13
+
14
+ # The values of all constants defined in this module
15
+ PITCHES = []
16
+
17
+ # The names of all constants defined in this module
18
+ PITCH_NAMES = []
19
+
20
+ 128.times do |note_number|
21
+ pitch = Pitch.from_i( note_number )
22
+ PITCHES << pitch
23
+
24
+ octave_str = pitch.octave.to_s.sub(/-/,'_') # '_1' for -1
25
+ name = "#{pitch.pitch_class}#{octave_str}"
26
+ PITCH_NAMES << name
27
+
28
+ # TODO? also define lower case pseudo constants for consistency with the grammar?
29
+
30
+ const_set name, pitch
31
+ end
32
+
33
+ PITCHES.freeze
34
+ PITCH_NAMES.freeze
35
+
36
+ # Lookup the value of an pitch constant by name.
37
+ # @example lookup value of 'C3'
38
+ # MTK::Pitches['C3']
39
+ # @see Pitch.from_s
40
+ # @note Unlike {Pitch.from_s} this method will accept either '_' (underscore) or '-' (minus) and treat it like '-' (minus)
41
+ # @note Unlike {Pitch.from_s} this method only accepts the accidental 'b'
42
+ def self.[](name)
43
+ begin
44
+ const_get name.sub('-','_')
45
+ rescue
46
+ nil
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end