mtk 0.0.1 → 0.0.2

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 (93) hide show
  1. data/.yardopts +9 -0
  2. data/INTRO.md +73 -0
  3. data/LICENSE.txt +27 -0
  4. data/README.md +93 -18
  5. data/Rakefile +13 -1
  6. data/examples/crescendo.rb +20 -0
  7. data/examples/dynamic_pattern.rb +39 -0
  8. data/examples/play_midi.rb +19 -0
  9. data/examples/print_midi.rb +13 -0
  10. data/examples/random_tone_row.rb +18 -0
  11. data/examples/tone_row_melody.rb +21 -0
  12. data/lib/mtk/_constants/durations.rb +80 -0
  13. data/lib/mtk/_constants/intensities.rb +81 -0
  14. data/lib/mtk/{constants → _constants}/intervals.rb +10 -1
  15. data/lib/mtk/_constants/pitch_classes.rb +35 -0
  16. data/lib/mtk/_constants/pitches.rb +49 -0
  17. data/lib/mtk/{numeric_extensions.rb → _numeric_extensions.rb} +0 -0
  18. data/lib/mtk/event.rb +14 -5
  19. data/lib/mtk/helper/collection.rb +114 -0
  20. data/lib/mtk/helper/event_builder.rb +85 -0
  21. data/lib/mtk/{constants → helper}/pseudo_constants.rb +7 -6
  22. data/lib/mtk/lang/grammar.rb +17 -0
  23. data/lib/mtk/lang/mtk_grammar.citrus +60 -0
  24. data/lib/mtk/midi/file.rb +10 -15
  25. data/lib/mtk/midi/jsound_input.rb +68 -0
  26. data/lib/mtk/midi/jsound_output.rb +80 -0
  27. data/lib/mtk/note.rb +22 -3
  28. data/lib/mtk/pattern/abstract_pattern.rb +132 -0
  29. data/lib/mtk/pattern/choice.rb +25 -9
  30. data/lib/mtk/pattern/cycle.rb +51 -0
  31. data/lib/mtk/pattern/enumerator.rb +26 -0
  32. data/lib/mtk/pattern/function.rb +46 -0
  33. data/lib/mtk/pattern/lines.rb +60 -0
  34. data/lib/mtk/pattern/palindrome.rb +42 -0
  35. data/lib/mtk/pattern/sequence.rb +15 -50
  36. data/lib/mtk/pitch.rb +45 -6
  37. data/lib/mtk/pitch_class.rb +36 -35
  38. data/lib/mtk/pitch_class_set.rb +46 -14
  39. data/lib/mtk/pitch_set.rb +20 -31
  40. data/lib/mtk/sequencer/abstract_sequencer.rb +85 -0
  41. data/lib/mtk/sequencer/rhythmic_sequencer.rb +29 -0
  42. data/lib/mtk/sequencer/step_sequencer.rb +26 -0
  43. data/lib/mtk/timeline.rb +75 -22
  44. data/lib/mtk/transform/invertible.rb +15 -0
  45. data/lib/mtk/{util → transform}/mappable.rb +6 -2
  46. data/lib/mtk/transform/set_theory_operations.rb +34 -0
  47. data/lib/mtk/transform/transposable.rb +14 -0
  48. data/lib/mtk.rb +56 -22
  49. data/spec/mtk/_constants/durations_spec.rb +118 -0
  50. data/spec/mtk/{constants/dynamics_spec.rb → _constants/intensities_spec.rb} +48 -17
  51. data/spec/mtk/{constants → _constants}/intervals_spec.rb +21 -0
  52. data/spec/mtk/_constants/pitch_classes_spec.rb +58 -0
  53. data/spec/mtk/_constants/pitches_spec.rb +52 -0
  54. data/spec/mtk/{numeric_extensions_spec.rb → _numeric_extensions_spec.rb} +0 -0
  55. data/spec/mtk/event_spec.rb +19 -0
  56. data/spec/mtk/helper/collection_spec.rb +291 -0
  57. data/spec/mtk/helper/event_builder_spec.rb +92 -0
  58. data/spec/mtk/helper/pseudo_constants_spec.rb +20 -0
  59. data/spec/mtk/lang/grammar_spec.rb +100 -0
  60. data/spec/mtk/midi/file_spec.rb +41 -6
  61. data/spec/mtk/note_spec.rb +53 -3
  62. data/spec/mtk/pattern/abstract_pattern_spec.rb +45 -0
  63. data/spec/mtk/pattern/choice_spec.rb +89 -3
  64. data/spec/mtk/pattern/cycle_spec.rb +133 -0
  65. data/spec/mtk/pattern/function_spec.rb +133 -0
  66. data/spec/mtk/pattern/lines_spec.rb +93 -0
  67. data/spec/mtk/pattern/note_cycle_spec.rb.bak +116 -0
  68. data/spec/mtk/pattern/palindrome_spec.rb +124 -0
  69. data/spec/mtk/pattern/pitch_cycle_spec.rb.bak +47 -0
  70. data/spec/mtk/pattern/pitch_sequence_spec.rb.bak +37 -0
  71. data/spec/mtk/pattern/sequence_spec.rb +128 -31
  72. data/spec/mtk/pitch_class_set_spec.rb +240 -7
  73. data/spec/mtk/pitch_class_spec.rb +84 -18
  74. data/spec/mtk/pitch_set_spec.rb +45 -10
  75. data/spec/mtk/pitch_spec.rb +59 -0
  76. data/spec/mtk/sequencer/abstract_sequencer_spec.rb +159 -0
  77. data/spec/mtk/sequencer/rhythmic_sequencer_spec.rb +49 -0
  78. data/spec/mtk/sequencer/step_sequencer_spec.rb +71 -0
  79. data/spec/mtk/timeline_spec.rb +118 -15
  80. data/spec/spec_helper.rb +4 -3
  81. metadata +59 -22
  82. data/lib/mtk/chord.rb +0 -47
  83. data/lib/mtk/constants/dynamics.rb +0 -56
  84. data/lib/mtk/constants/pitch_classes.rb +0 -18
  85. data/lib/mtk/constants/pitches.rb +0 -24
  86. data/lib/mtk/pattern/note_sequence.rb +0 -60
  87. data/lib/mtk/pattern/pitch_sequence.rb +0 -22
  88. data/lib/mtk/patterns.rb +0 -4
  89. data/spec/mtk/chord_spec.rb +0 -74
  90. data/spec/mtk/constants/pitch_classes_spec.rb +0 -35
  91. data/spec/mtk/constants/pitches_spec.rb +0 -23
  92. data/spec/mtk/pattern/note_sequence_spec.rb +0 -121
  93. data/spec/mtk/pattern/pitch_sequence_spec.rb +0 -47
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MTK::Pitches do
4
-
5
- it "defines constants for the 128 notes in MIDI" do
6
- Pitches.constants.length.should == 129 # there's also the PITCHES constant
7
- Pitches::C_1.should == Pitch.from_s('C-1')
8
- Pitches::D0.should == Pitch.from_s('D0')
9
- Pitches::Eb1.should == Pitch.from_s('Eb1')
10
- Pitches::G9.should == Pitch.from_s('g9')
11
- end
12
-
13
- describe "PITCHES" do
14
- it "contains all 128 pitch constants" do
15
- Pitches::PITCHES.length.should == 128
16
- Pitches::PITCHES.should include Pitches::C_1
17
- Pitches::PITCHES.should include Pitches::D0
18
- Pitches::PITCHES.should include Pitches::Eb1
19
- Pitches::PITCHES.should include Pitches::G9
20
- end
21
- end
22
-
23
- end
@@ -1,121 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MTK::Pattern::NoteSequence do
4
-
5
- def note(pitch, intensity=mf, duration=1)
6
- Note.new pitch,intensity,duration
7
- end
8
-
9
- def chord(pitches, intensity=mf, duration=1)
10
- Chord.new pitches,intensity,duration
11
- end
12
-
13
- describe "#new" do
14
- it "allows default pitch to be specified"
15
- it "allows default intensity to be specified"
16
- it "allows default duration to be specified"
17
- end
18
-
19
- describe "#next" do
20
- it "iterates through the pitch, intensity, and duration list in parallel to emit Notes" do
21
- sequence = Pattern::NoteSequence.new [C4, D4, E4], [p, f], [1,2,3,4]
22
- sequence.next.should == Note.new(C4, p, 1)
23
- sequence.next.should == Note.new(D4, f, 2)
24
- sequence.next.should == Note.new(E4, p, 3)
25
- sequence.next.should == Note.new(C4, f, 4)
26
- sequence.next.should == Note.new(D4, p, 1)
27
- sequence.next.should == Note.new(E4, f, 2)
28
- end
29
-
30
- it "defaults to Pitch 'C4' when no pitches are given" do
31
- sequence = Pattern::NoteSequence.new [], [p,f], [1,2,3]
32
- sequence.next.should == Note.new(C4, p, 1)
33
- sequence.next.should == Note.new(C4, f, 2)
34
- sequence.next.should == Note.new(C4, p, 3)
35
- end
36
-
37
- it "defaults to intensity 'mf' when no intensities are given" do
38
- sequence = Pattern::NoteSequence.new [C4, D4, E4], nil, [2]
39
- sequence.next.should == Note.new(C4, mf, 2)
40
- sequence.next.should == Note.new(D4, mf, 2)
41
- sequence.next.should == Note.new(E4, mf, 2)
42
- end
43
-
44
- it "defaults to duration 1 when no durations are given" do
45
- sequence = Pattern::NoteSequence.new [C4, D4, E4], [p, f]
46
- sequence.next.should == Note.new(C4, p, 1)
47
- sequence.next.should == Note.new(D4, f, 1)
48
- sequence.next.should == Note.new(E4, p, 1)
49
- end
50
-
51
- it "uses the previous pitch/intensity/duration when it encounters a nil value" do
52
- sequence = Pattern::NoteSequence.new [C4, D4, E4, F4, nil], [mp, mf, f, nil], [1, 2, nil]
53
- sequence.next.should == Note.new(C4, mp, 1)
54
- sequence.next.should == Note.new(D4, mf, 2)
55
- sequence.next.should == Note.new(E4, f, 2)
56
- sequence.next.should == Note.new(F4, f, 1)
57
- sequence.next.should == Note.new(F4, mp, 2)
58
- sequence.next.should == Note.new(C4, mf, 2)
59
- end
60
-
61
- it "adds Numeric intervals in the pitch list to the previous pitch" do
62
- sequence = Pattern::NoteSequence.new [C4, 1, 2, 3]
63
- sequence.next.should == note(C4)
64
- sequence.next.should == note(C4+1)
65
- sequence.next.should == note(C4+1+2)
66
- sequence.next.should == note(C4+1+2+3)
67
- sequence.next.should == note(C4)
68
- end
69
-
70
- it "goes to the nearest Pitch for any PitchClasses in the pitch list" do
71
- sequence = Pattern::NoteSequence.new [C4, F, C, G, C]
72
- sequence.next.should == note(C4)
73
- sequence.next.should == note(F4)
74
- sequence.next.should == note(C4)
75
- sequence.next.should == note(G3)
76
- sequence.next.should == note(C4)
77
- end
78
-
79
- it "does not endlessly ascend or descend when alternating between two pitch classes a tritone apart" do
80
- sequence = Pattern::NoteSequence.new [C4, Gb, C, Gb, C]
81
- sequence.next.should == note(C4)
82
- sequence.next.should == note(Gb4)
83
- sequence.next.should == note(C4)
84
- sequence.next.should == note(Gb4)
85
- sequence.next.should == note(C4)
86
- end
87
-
88
- it "sequences Chords for pitch list items that are PitchSets" do
89
- sequence = Pattern::NoteSequence.new [PitchSet.new([C4, E4, G4]), C4, PitchSet.new([D4, F4, A4])]
90
- sequence.next.should == chord([C4, E4, G4])
91
- sequence.next.should == note(C4)
92
- sequence.next.should == chord([D4, F4, A4])
93
- end
94
-
95
- it "adds numeric intervals to PitchSets" do
96
- sequence = Pattern::NoteSequence.new [PitchSet.new([C4, E4, G4]), 2]
97
- sequence.next.should == chord([C4, E4, G4])
98
- sequence.next.should == chord([D4, Gb4, A4])
99
- end
100
-
101
- it "goes to the nearest Pitch relative to the lowest note in the PitchSet for any PitchClasses in the pitch list" do
102
- sequence = Pattern::NoteSequence.new [PitchSet.new([C4, E4, G4]), F, D, Bb]
103
- sequence.next.should == chord([C4, E4, G4])
104
- sequence.next.should == chord([F4, A4, C5])
105
- sequence.next.should == chord([D4, Gb4, A4])
106
- sequence.next.should == chord([Bb3, D4, F4])
107
- end
108
- end
109
-
110
- describe "#reset" do
111
- it "resets the sequence to the beginning" do
112
- sequence = Pattern::NoteSequence.new [C4, D4, E4], [p, f], [1,2,3,4]
113
- sequence.next.should == Note.new(C4, p, 1)
114
- sequence.next.should == Note.new(D4, f, 2)
115
- sequence.reset
116
- sequence.next.should == Note.new(C4, p, 1)
117
- sequence.next.should == Note.new(D4, f, 2)
118
- end
119
- end
120
-
121
- end
@@ -1,47 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MTK::Pattern::PitchSequence do
4
-
5
- describe "#next" do
6
- it "enumerates Pitches" do
7
- sequence = Pattern::PitchSequence.new [C4, D4, E4]
8
- sequence.next.should == C4
9
- sequence.next.should == D4
10
- sequence.next.should == E4
11
- end
12
-
13
- it "adds Numeric elements (intervals) to the previous pitch" do
14
- sequence = Pattern::PitchSequence.new [C4, 1, 2, 3]
15
- sequence.next.should == C4
16
- sequence.next.should == C4+1
17
- sequence.next.should == C4+1+2
18
- sequence.next.should == C4+1+2+3
19
- end
20
-
21
- it "returns a Pitch when encountering a Pitch after another type" do
22
- sequence = Pattern::PitchSequence.new [C4, 1, C4]
23
- sequence.next
24
- sequence.next
25
- sequence.next.should == C4
26
- end
27
-
28
- it "goes to the nearest Pitch for any PitchClasses in the pitch list" do
29
- sequence = Pattern::PitchSequence.new [C4, F, C, G, C]
30
- sequence.next.should == C4
31
- sequence.next.should == F4
32
- sequence.next.should == C4
33
- sequence.next.should == G3
34
- sequence.next.should == C4
35
- end
36
-
37
- it "does not endlessly ascend or descend when alternating between two pitch classes a tritone apart" do
38
- sequencer = Pattern::PitchSequence.new [C4, Gb, C, Gb, C]
39
- sequencer.next.should == C4
40
- sequencer.next.should == Gb4
41
- sequencer.next.should == C4
42
- sequencer.next.should == Gb4
43
- sequencer.next.should == C4
44
- end
45
-
46
- end
47
- end