mtk 0.0.3.2 → 0.0.3.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 (102) hide show
  1. data/.yardopts +2 -2
  2. data/DEVELOPMENT_NOTES.md +20 -0
  3. data/README.md +9 -3
  4. data/Rakefile +47 -13
  5. data/bin/mtk +55 -20
  6. data/examples/crescendo.rb +4 -4
  7. data/examples/{drum_pattern1.rb → drum_pattern.rb} +8 -8
  8. data/examples/dynamic_pattern.rb +5 -5
  9. data/examples/gets_and_play.rb +3 -2
  10. data/examples/notation.rb +3 -3
  11. data/examples/play_midi.rb +4 -4
  12. data/examples/print_midi.rb +2 -2
  13. data/examples/random_tone_row.rb +3 -3
  14. data/examples/syntax_to_midi.rb +2 -2
  15. data/examples/test_output.rb +4 -5
  16. data/examples/tone_row_melody.rb +7 -5
  17. data/lib/mtk/core/duration.rb +213 -0
  18. data/lib/mtk/core/intensity.rb +158 -0
  19. data/lib/mtk/core/interval.rb +157 -0
  20. data/lib/mtk/core/pitch.rb +154 -0
  21. data/lib/mtk/core/pitch_class.rb +194 -0
  22. data/lib/mtk/events/event.rb +4 -4
  23. data/lib/mtk/events/note.rb +12 -12
  24. data/lib/mtk/events/timeline.rb +232 -0
  25. data/lib/mtk/groups/chord.rb +56 -0
  26. data/lib/mtk/{helpers → groups}/collection.rb +33 -1
  27. data/lib/mtk/groups/melody.rb +96 -0
  28. data/lib/mtk/groups/pitch_class_set.rb +163 -0
  29. data/lib/mtk/{helpers → groups}/pitch_collection.rb +1 -1
  30. data/lib/mtk/{midi → io}/dls_synth_device.rb +3 -1
  31. data/lib/mtk/{midi → io}/dls_synth_output.rb +10 -10
  32. data/lib/mtk/{midi → io}/jsound_input.rb +2 -2
  33. data/lib/mtk/{midi → io}/jsound_output.rb +9 -9
  34. data/lib/mtk/{midi/file.rb → io/midi_file.rb} +13 -13
  35. data/lib/mtk/{midi/input.rb → io/midi_input.rb} +4 -4
  36. data/lib/mtk/{midi/output.rb → io/midi_output.rb} +8 -8
  37. data/lib/mtk/{helpers/lilypond.rb → io/notation.rb} +5 -5
  38. data/lib/mtk/{midi → io}/unimidi_input.rb +2 -2
  39. data/lib/mtk/{midi → io}/unimidi_output.rb +14 -9
  40. data/lib/mtk/{constants → lang}/durations.rb +11 -11
  41. data/lib/mtk/{constants → lang}/intensities.rb +11 -11
  42. data/lib/mtk/{constants → lang}/intervals.rb +17 -17
  43. data/lib/mtk/lang/mtk_grammar.citrus +9 -9
  44. data/lib/mtk/{constants → lang}/pitch_classes.rb +5 -5
  45. data/lib/mtk/{constants → lang}/pitches.rb +7 -7
  46. data/lib/mtk/{helpers → lang}/pseudo_constants.rb +1 -1
  47. data/lib/mtk/{variable.rb → lang/variable.rb} +1 -1
  48. data/lib/mtk/numeric_extensions.rb +40 -47
  49. data/lib/mtk/patterns/for_each.rb +1 -1
  50. data/lib/mtk/patterns/pattern.rb +3 -3
  51. data/lib/mtk/sequencers/event_builder.rb +16 -15
  52. data/lib/mtk/sequencers/legato_sequencer.rb +1 -1
  53. data/lib/mtk/sequencers/rhythmic_sequencer.rb +1 -1
  54. data/lib/mtk/sequencers/sequencer.rb +8 -8
  55. data/lib/mtk/sequencers/step_sequencer.rb +2 -2
  56. data/lib/mtk.rb +33 -39
  57. data/spec/mtk/{duration_spec.rb → core/duration_spec.rb} +3 -3
  58. data/spec/mtk/{intensity_spec.rb → core/intensity_spec.rb} +3 -3
  59. data/spec/mtk/{interval_spec.rb → core/interval_spec.rb} +1 -1
  60. data/spec/mtk/{pitch_class_spec.rb → core/pitch_class_spec.rb} +1 -1
  61. data/spec/mtk/{pitch_spec.rb → core/pitch_spec.rb} +8 -8
  62. data/spec/mtk/events/event_spec.rb +4 -4
  63. data/spec/mtk/events/note_spec.rb +8 -8
  64. data/spec/mtk/{timeline_spec.rb → events/timeline_spec.rb} +47 -47
  65. data/spec/mtk/{chord_spec.rb → groups/chord_spec.rb} +18 -16
  66. data/spec/mtk/{helpers → groups}/collection_spec.rb +3 -3
  67. data/spec/mtk/{melody_spec.rb → groups/melody_spec.rb} +36 -34
  68. data/spec/mtk/{pitch_class_set_spec.rb → groups/pitch_class_set_spec.rb} +57 -55
  69. data/spec/mtk/{midi/file_spec.rb → io/midi_file_spec.rb} +17 -17
  70. data/spec/mtk/{midi/output_spec.rb → io/midi_output_spec.rb} +6 -6
  71. data/spec/mtk/{constants → lang}/durations_spec.rb +1 -1
  72. data/spec/mtk/{constants → lang}/intensities_spec.rb +1 -1
  73. data/spec/mtk/{constants → lang}/intervals_spec.rb +1 -1
  74. data/spec/mtk/lang/parser_spec.rb +12 -6
  75. data/spec/mtk/{constants → lang}/pitch_classes_spec.rb +1 -1
  76. data/spec/mtk/{constants → lang}/pitches_spec.rb +1 -1
  77. data/spec/mtk/{helpers → lang}/pseudo_constants_spec.rb +2 -2
  78. data/spec/mtk/{variable_spec.rb → lang/variable_spec.rb} +4 -4
  79. data/spec/mtk/numeric_extensions_spec.rb +35 -55
  80. data/spec/mtk/patterns/for_each_spec.rb +1 -1
  81. data/spec/mtk/patterns/sequence_spec.rb +1 -1
  82. data/spec/mtk/sequencers/legato_sequencer_spec.rb +2 -2
  83. data/spec/mtk/sequencers/rhythmic_sequencer_spec.rb +4 -4
  84. data/spec/mtk/sequencers/step_sequencer_spec.rb +5 -5
  85. data/spec/spec_helper.rb +7 -6
  86. metadata +75 -61
  87. data/ext/mkrf_conf.rb +0 -25
  88. data/lib/mtk/chord.rb +0 -55
  89. data/lib/mtk/duration.rb +0 -211
  90. data/lib/mtk/helpers/convert.rb +0 -36
  91. data/lib/mtk/helpers/output_selector.rb +0 -67
  92. data/lib/mtk/intensity.rb +0 -156
  93. data/lib/mtk/interval.rb +0 -155
  94. data/lib/mtk/melody.rb +0 -94
  95. data/lib/mtk/pitch.rb +0 -152
  96. data/lib/mtk/pitch_class.rb +0 -192
  97. data/lib/mtk/pitch_class_set.rb +0 -161
  98. data/lib/mtk/timeline.rb +0 -230
  99. data/spec/mtk/midi/jsound_input_spec.rb +0 -11
  100. data/spec/mtk/midi/jsound_output_spec.rb +0 -11
  101. data/spec/mtk/midi/unimidi_input_spec.rb +0 -11
  102. data/spec/mtk/midi/unimidi_output_spec.rb +0 -11
data/.yardopts CHANGED
@@ -4,7 +4,7 @@
4
4
  --protected
5
5
  --no-private
6
6
  lib/**/*.rb
7
- - *.md
8
- - examples/*
7
+ - INTRO.md
9
8
  - lib/**/*.citrus
10
9
  - LICENSE.txt
10
+ - examples/**/*.rb
data/DEVELOPMENT_NOTES.md CHANGED
@@ -113,3 +113,23 @@ or, to automatically refresh the documentation as you work:
113
113
 
114
114
  bundle exec yard server -r
115
115
  open http://localhost:8808
116
+
117
+
118
+ ### Release the gems ###
119
+
120
+ To better handle the differing depdencies between CRuby and JRuby, there are two gems, mtk and jmtk.
121
+ You can build both gems with:
122
+
123
+ bundle exec gem:build
124
+
125
+ Do a local sanity check by installing
126
+
127
+ # Using CRuby 1.9 or 2.0:
128
+ gem install mtk-0.x.x.gem
129
+ ... test mtk command ...
130
+
131
+ rvm use jruby
132
+ jgem install jmtk-0.x.x-java.gem
133
+ ... test jmtk command ...
134
+
135
+ And then authorized users can push gems to rubygems.org.
data/README.md CHANGED
@@ -19,20 +19,26 @@ Features
19
19
  Getting Started
20
20
  ---------------
21
21
 
22
- MTK works with Ruby 1.9, Ruby 2.0, and JRuby
22
+ MTK works with Ruby 1.9, Ruby 2.0, and JRuby 1.7+.
23
+
24
+ JRuby is recommended for Windows users.
23
25
 
24
26
  0. Install
25
27
 
26
28
  gem install mtk
27
29
 
28
- or if using JRuby:
30
+ Or for JRuby:
29
31
 
30
- jgem install mtk
32
+ jgem install jmtk
31
33
 
32
34
  0. Learn the command-line interface:
33
35
 
34
36
  mtk --help
35
37
 
38
+ Or for JRuby:
39
+
40
+ jmtk --help
41
+
36
42
  0. Learn the MTK syntax: TODO... documentation forthcoming. In the meantime, see the unit tests @ https://github.com/adamjmurray/mtk/blob/master/spec/mtk/lang/parser_spec.rb
37
43
 
38
44
  0. Check out examples: https://github.com/adamjmurray/mtk/tree/master/examples
data/Rakefile CHANGED
@@ -1,12 +1,14 @@
1
1
  require 'rspec/core/rake_task'
2
2
  require 'rake/clean'
3
3
 
4
+ GEM_VERSION = '0.0.3.3'
5
+
4
6
  SUPPORTED_RUBIES = %w[ 1.9.3 2.0 jruby-1.7.4 ]
5
- ENV['JRUBY_OPTS'] = '--1.9'
7
+
8
+ CLEAN.include('html','doc','coverage.data','coverage', '*.gemspec', '*.gem') # clean and clobber do the same thing for now
6
9
 
7
10
  task :default => :test
8
11
 
9
- CLEAN.include('html','doc','coverage.data','coverage', '*.gem') # clean and clobber do the same thing for now
10
12
 
11
13
  desc "Run RSpec tests with full output"
12
14
  RSpec::Core::RakeTask.new('test') do |spec|
@@ -16,17 +18,7 @@ RSpec::Core::RakeTask.new('test') do |spec|
16
18
  spec.pattern = "spec/**/#{ARGV[1]}*"
17
19
  end
18
20
  end
19
-
20
- task :spec => :test
21
-
22
-
23
- namespace :gem do
24
- desc "Install gems for supported versions of Ruby: #{SUPPORTED_RUBIES.join ', '}"
25
- task :install_dependencies do
26
- fail unless system("rvm #{SUPPORTED_RUBIES.join ','} do bundle install")
27
- end
28
- end
29
-
21
+ task :spec => :test # alias test task as spec task
30
22
 
31
23
  namespace :test do
32
24
  desc "Run RSpec tests with summary output and fast failure"
@@ -64,3 +56,45 @@ begin
64
56
  end
65
57
  rescue Exception # yard is optional, so don't cause rake to fail if it's missing
66
58
  end
59
+
60
+
61
+ namespace :gem do
62
+ desc "Install gems for supported versions of Ruby: #{SUPPORTED_RUBIES.join ', '}"
63
+ task :install_dependencies do
64
+ fail unless system("rvm #{SUPPORTED_RUBIES.join ','} do bundle install")
65
+ end
66
+
67
+ desc "Build the CRuby and JRuby gems for distribution"
68
+ task :build do
69
+ gem_version = GEM_VERSION
70
+
71
+ gem_name = 'mtk'
72
+ platform_specific_depedencies = {unimidi:'~> 0.3'}
73
+ additional_gem_specifications = {}
74
+ generate_gemspec(binding)
75
+
76
+ gem_name = 'jmtk'
77
+ platform_specific_depedencies = {jsound:'~> 0.1'}
78
+ additional_gem_specifications = {platform:'java'}
79
+ generate_gemspec(binding)
80
+ end
81
+
82
+ def generate_gemspec(erb_bindings)
83
+ gem_name = erb_bindings.eval('gem_name')
84
+
85
+ erb = ERB.new(IO.read 'mtk.gemspec.erb')
86
+ gemspec = erb.result(erb_bindings)
87
+
88
+ gemspec_filename = "#{gem_name}.gemspec"
89
+ puts "Generating #{gemspec_filename}"
90
+ IO.write(gemspec_filename, gemspec)
91
+
92
+ if gem_name == 'jmtk'
93
+ `cp bin/mtk bin/jmtk` # jmtk gem uses this as the binary
94
+ end
95
+ puts "Building gem"
96
+ puts `gem build #{gemspec_filename}`
97
+ ensure
98
+ `rm bin/jmtk`
99
+ end
100
+ end
data/bin/mtk CHANGED
@@ -23,13 +23,12 @@ option_parser = OptionParser.new do |opts|
23
23
 
24
24
  opts.on('-e [syntax]', '--eval [syntax]', 'Convert the given MTK syntax String to MIDI',
25
25
  'or start an interactive interpreter when [syntax] is omitted',
26
- 'if a --file is given, write the MIDI to a file',
27
- 'if an --output is given, play the MIDI',
28
- 'otherwise print the MIDI') {|syntax| options[:eval] = syntax }
26
+ 'Behaves like --convert when a --file or --output is given') {|syntax| options[:eval] = syntax }
29
27
 
30
28
  opts.separator ''
31
29
 
32
- opts.on('-f FILE', '--file FILE', 'Write the output of --convert, --eval, or --input to a file') {|file| options[:file] = file }
30
+ opts.on('-f FILE', '--file FILE', 'Write the output of --convert, --eval, --input, or --watch to a file'
31
+ ) {|file| options[:file] = file }
33
32
 
34
33
  opts.separator ''
35
34
 
@@ -63,6 +62,9 @@ option_parser = OptionParser.new do |opts|
63
62
  #
64
63
  #opts.separator ''
65
64
 
65
+ opts.on('-w FILE', '--watch FILE', 'Watch an MTK syntax file for changes and automatically convert to MIDI',
66
+ 'Behaves like --convert when a --file or --output is given') {|file| options[:watch] = file }
67
+
66
68
  end
67
69
 
68
70
 
@@ -79,7 +81,7 @@ ERROR_INPUT_NOT_FOUND = 4
79
81
 
80
82
  # Immediately trying to play output while Ruby is still "warming up" can cause timing issues with
81
83
  # the first couple notes. So we play this "empty" Timeline containing a rest to address that issue.
82
- WARMUP = MTK::Timeline.from_hash( {0 => MTK::Events::Note.new(MTK::Pitch(60), MTK::Duration(-1))} )
84
+ WARMUP = MTK::Events::Timeline.from_h( {0 => MTK.Note(60,-1)} )
83
85
 
84
86
  #######################################################################
85
87
 
@@ -88,20 +90,25 @@ begin
88
90
  rescue OptionParser::MissingArgument, OptionParser::InvalidOption
89
91
  puts "Invalid command, #{$!}"
90
92
  puts "For command line help: #{$0} --help"
93
+ puts "For command line help: #{$0} --help"
91
94
  exit ERROR_INVALID_COMMAND
92
95
  end
93
96
 
94
97
 
95
98
  def setup_io
96
- require 'mtk/midi/input'
97
- require 'mtk/midi/output'
99
+ require 'mtk/io/midi_input'
100
+ require 'mtk/io/midi_output'
98
101
  end
99
102
 
100
103
 
101
104
  def convert(mtk_syntax)
102
105
  sequencer = MTK::Lang::Parser.parse(mtk_syntax)
103
- timeline = sequencer.to_timeline
104
- output(timeline)
106
+ if sequencer
107
+ timeline = sequencer.to_timeline
108
+ output(timeline)
109
+ end
110
+ rescue Citrus::ParseError
111
+ STDERR.puts $!
105
112
  end
106
113
 
107
114
 
@@ -111,8 +118,8 @@ def output(timelines, print_header='Timeline')
111
118
  @output.play WARMUP
112
119
  @output.play timelines.first # TODO: support multiple timelines
113
120
  elsif @file
114
- require 'mtk/midi/file'
115
- MTK::MIDI_File(@file).write timelines
121
+ require 'mtk/io/midi_file'
122
+ MTK.MIDIFile(@file).write timelines
116
123
  else
117
124
  puts print_header, timelines
118
125
  puts
@@ -136,12 +143,20 @@ def record
136
143
  end
137
144
 
138
145
 
146
+ def watch_file_updated?
147
+ mtime = File.stat(@watch_file).mtime
148
+ updated = @watch_file_mtime.nil? || @watch_file_mtime < mtime
149
+ @watch_file_mtime = mtime
150
+ updated
151
+ end
152
+
153
+
139
154
  #######################################################################
140
155
 
141
156
  if options[:list]
142
157
  setup_io
143
- input_names = MTK::MIDI::Input.devices_by_name.keys
144
- output_names = MTK::MIDI::Output.devices_by_name.keys
158
+ input_names = MTK::IO::MIDIInput.devices_by_name.keys
159
+ output_names = MTK::IO::MIDIOutput.devices_by_name.keys
145
160
  puts
146
161
  puts (['INPUTS:'] + input_names).join("\n * ")
147
162
  puts
@@ -158,7 +173,7 @@ end
158
173
  if options[:input]
159
174
  setup_io
160
175
  input_name = options[:input]
161
- @input = MTK::MIDI::Input.find_by_name /#{input_name}/
176
+ @input = MTK::IO::MIDIInput.find_by_name /#{input_name}/
162
177
  if @input
163
178
  puts "Using input '#{@input.name}'"
164
179
  else
@@ -170,7 +185,7 @@ end
170
185
  if options[:output]
171
186
  setup_io
172
187
  output_name = options[:output]
173
- @output = MTK::MIDI::Output.find_by_name /#{output_name}/
188
+ @output = MTK::IO::MIDIOutput.find_by_name /#{output_name}/
174
189
  if @output
175
190
  puts "Using output '#{@output.name}'"
176
191
  else
@@ -184,8 +199,8 @@ file = options[:file]
184
199
 
185
200
  if options[:play]
186
201
  filename = options[:play]
187
- require 'mtk/midi/file'
188
- timelines = MTK::MIDI_File(filename).to_timelines
202
+ require 'mtk/io/midi_file'
203
+ timelines = MTK.MIDIFile(filename).to_timelines
189
204
  output(timelines, "Timeline for #{filename}")
190
205
  end
191
206
 
@@ -193,9 +208,13 @@ if options.has_key? :eval
193
208
  mtk_syntax = options[:eval]
194
209
  if mtk_syntax.nil?
195
210
  puts "Starting the interactive interpreter."
196
- loop do
197
- puts "Enter MTK syntax. Press Ctrl+C to exit."
198
- convert(gets)
211
+ begin
212
+ loop do
213
+ puts "Enter MTK syntax. Press Ctrl+C to exit."
214
+ convert(gets)
215
+ end
216
+ rescue SystemExit,Interrupt
217
+ Kernel.exit
199
218
  end
200
219
  else
201
220
  convert(mtk_syntax)
@@ -208,6 +227,22 @@ if options[:convert]
208
227
  convert(mtk_syntax)
209
228
  end
210
229
 
230
+ if options[:watch]
231
+ @watch_file = options[:watch]
232
+ puts "Watching #{@watch_file}. Press Ctrl+C to exit."
233
+ watch_file_updated? # prime the watcher
234
+ begin
235
+ loop do
236
+ mtk_syntax = IO.read(@watch_file)
237
+ convert(mtk_syntax)
238
+ Kernel.sleep(0.5) until watch_file_updated?
239
+ puts "#{Time.new}: #{@watch_file} updated"
240
+ end
241
+ rescue SystemExit,Interrupt
242
+ Kernel.exit
243
+ end
244
+ end
245
+
211
246
  #if options.has_key? :tutorial
212
247
  # puts "TODO: tutorial"
213
248
  #end
@@ -3,10 +3,10 @@
3
3
  # NOTE: this blindly overwrites any existing MTK-crescendo.mid file, unless an argument is provided
4
4
 
5
5
  require 'mtk'
6
- require 'mtk/midi/file'
6
+ require 'mtk/io/midi_file'
7
7
  include MTK
8
- include Constants::Pitches
9
- include Constants::Intensities
8
+ include Lang::Pitches
9
+ include Lang::Intensities
10
10
 
11
11
  file = ARGV[0] || 'MTK-crescendo.mid'
12
12
 
@@ -16,5 +16,5 @@ crescendo = Patterns.Lines pp, [fff, scale.length-1] # step from pp to fff over
16
16
  sequencer = Sequencers.StepSequencer scale, crescendo
17
17
  timeline = sequencer.to_timeline
18
18
 
19
- MIDI_File(file).write timeline
19
+ MIDIFile(file).write timeline
20
20
 
@@ -1,8 +1,8 @@
1
1
  require 'mtk'
2
- require 'mtk/midi/file'
2
+ require 'mtk/io/midi_file'
3
3
  include MTK
4
- include Constants::Pitches
5
- include Constants::Intensities
4
+ include Lang::Pitches
5
+ include Lang::Intensities
6
6
 
7
7
  file = ARGV[0] || "MTK-#{File.basename(__FILE__,'.rb')}.mid"
8
8
 
@@ -10,14 +10,14 @@ _ = nil # defines _ as a rest
10
10
 
11
11
  pattern = {# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
12
12
  C2 => [fff, _, _, _, mf, _, _, _, o, _, _, _, mp, _, _, _], # kick
13
- Db2 => [ _, _, o, _, _, _, mp, _, _, _, o, _, _, _, mf, _], # snare
14
- D2 => [ _, mp, _, mp, _, mp, _, mf, _, mp, _, mp, _, pp, _, mf] # hat
13
+ Db2 => [ _, _, o, _, _, _, mp, _, _, _, o, _, _, _, mf, _], # rim shot
14
+ D2 => [ _, mp, _, mp, _, mp, _, mf, _, mp, _, mp, _, pp, _, mf] # snare
15
15
  }
16
16
 
17
- timeline = Timeline.new
17
+ timeline = Events::Timeline.new
18
18
  for pitch,intensities in pattern
19
- track = Sequencers::StepSequencer( Patterns.Sequence(intensities), default_pitch: pitch )
19
+ track = Sequencers::StepSequencer( Patterns.Sequence(intensities), default_pitch:pitch, channel:10 )
20
20
  timeline.merge track.to_timeline
21
21
  end
22
22
 
23
- MIDI_File(file).write timeline
23
+ MIDIFile(file).write timeline
@@ -3,11 +3,11 @@
3
3
  # NOTE: this blindly overwrites any existing MTK-dynamic_pattern.mid file, unless an argument is provided
4
4
 
5
5
  require 'mtk'
6
- require 'mtk/midi/file'
6
+ require 'mtk/io/midi_file'
7
7
  include MTK
8
- include MTK::Constants::Pitches
9
- include MTK::Constants::Intensities
10
- include MTK::Constants::Intervals
8
+ include MTK::Lang::Pitches
9
+ include MTK::Lang::Intensities
10
+ include MTK::Lang::Intervals
11
11
 
12
12
  file = ARGV[0] || "MTK-#{File.basename __FILE__,'.rb'}.mid"
13
13
 
@@ -33,4 +33,4 @@ intensities = Patterns.Choice( mp,mf,o,ff,fff, weights: [1,2,3,2,1], max_cycles:
33
33
 
34
34
  sequencer = Sequencers.StepSequencer( pitches,intensities, step_size: 0.5, max_interval: 17 )
35
35
 
36
- MIDI_File(file).write( sequencer.to_timeline )
36
+ MIDIFile(file).write( sequencer.to_timeline )
@@ -1,10 +1,11 @@
1
1
  # Enter space-separated pitch classes (A,B,C,D,E,F,G) at the prompt and hear them play.
2
2
 
3
3
  require 'mtk'
4
- require 'mtk/helpers/output_selector'
4
+ require_relative 'helpers/output_selector'
5
5
  include MTK
6
+ include MTK::Core
6
7
 
7
- output = Helpers::OutputSelector.ensure_output ARGV[0]
8
+ output = OutputSelector.ensure_output ARGV[0]
8
9
 
9
10
  def get_pitch_classes
10
11
  puts "Enter pitch classes:"
data/examples/notation.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'mtk'
2
- require 'mtk/helpers/lilypond'
2
+ require 'mtk/io/notation'
3
3
  include MTK
4
4
 
5
5
  def arg_error(error)
@@ -18,5 +18,5 @@ arg_error "The output_file must end in '.png', '.pdf', or '.ps'" unless file
18
18
 
19
19
  sequencer = MTK::Lang::Parser.parse(syntax)
20
20
  timeline = sequencer.to_timeline
21
- # Helpers::Lilypond.open(file).write(timeline)
22
- Helpers::Lilypond.open(file, dpi:300).write(timeline) # higher resolution PNG
21
+ # MTK::IO::Notation.open(file).write(timeline)
22
+ MTK::IO::Notation.open(file, dpi:300).write(timeline) # higher resolution PNG
@@ -7,11 +7,11 @@ unless file
7
7
  end
8
8
 
9
9
  require 'mtk'
10
- require 'mtk/midi/file'
11
- require 'mtk/helpers/output_selector'
10
+ require 'mtk/io/midi_file'
11
+ require_relative 'helpers/output_selector'
12
12
 
13
- output = MTK::Helpers::OutputSelector.ensure_output(output_name)
13
+ output = OutputSelector.ensure_output(output_name)
14
14
 
15
- timeline = MTK.MIDI_File(file).to_timelines
15
+ timeline = MTK.MIDIFile(file).to_timelines
16
16
 
17
17
  output.play(timeline)
@@ -7,7 +7,7 @@ unless file
7
7
  end
8
8
 
9
9
  require 'mtk'
10
- require 'mtk/midi/file'
10
+ require 'mtk/io/midi_file'
11
11
  include MTK
12
12
 
13
- puts MIDI_File(file).to_timelines
13
+ puts MIDIFile(file).to_timelines
@@ -3,16 +3,16 @@
3
3
  # NOTE: this blindly overwrites any existing MTK-random_tone_row.mid file, unless an argument is provided
4
4
 
5
5
  require 'mtk'
6
- require 'mtk/midi/file'
6
+ require 'mtk/io/midi_file'
7
7
  include MTK
8
8
 
9
9
  file = ARGV[0] || 'MTK-random_tone_row.mid'
10
10
 
11
- row = PitchClassSet.random_row
11
+ row = Groups::PitchClassSet.random_row
12
12
  sequence = Patterns.Sequence *row
13
13
 
14
14
  sequencer = Sequencers.StepSequencer sequence
15
15
  timeline = sequencer.to_timeline
16
16
 
17
- MIDI_File(file).write timeline
17
+ MIDIFile(file).write timeline
18
18
 
@@ -3,7 +3,7 @@
3
3
  # NOTE: this blindly overwrites any existing MTK-syntax_to_midi.mid file, unless a second argument is provided
4
4
 
5
5
  require 'mtk'
6
- require 'mtk/midi/file'
6
+ require 'mtk/io/midi_file'
7
7
 
8
8
  input = ARGV[0]
9
9
  if input.nil?
@@ -24,5 +24,5 @@ syntax = IO.read(input)
24
24
  sequencer = MTK::Lang::Parser.parse(syntax)
25
25
  timeline = sequencer.to_timeline
26
26
 
27
- MTK::MIDI_File(output).write timeline
27
+ MTK::MIDIFile(output).write timeline
28
28
 
@@ -1,8 +1,7 @@
1
1
  require 'mtk'
2
- require 'mtk/helpers/output_selector'
3
- include MTK
4
- include Constants::Pitches
2
+ require_relative 'helpers/output_selector'
3
+ include MTK::Lang::Pitches
5
4
 
6
- output = Helpers::OutputSelector.ensure_output ARGV[0]
5
+ output = OutputSelector.ensure_output ARGV[0]
7
6
 
8
- output.play Note(C4,1,2)
7
+ output.play MTK.Note(C4,2,1)
@@ -3,10 +3,10 @@
3
3
  # NOTE: this blindly overwrites any existing MTK-tone_row_melody.mid file, unless an argument is provided
4
4
 
5
5
  require 'mtk'
6
- require 'mtk/midi/file'
6
+ require 'mtk/io/midi_file'
7
7
  include MTK
8
- include MTK::Constants::PitchClasses
9
- include MTK::Constants::Durations
8
+ include MTK::Lang::PitchClasses
9
+ include MTK::Lang::Durations
10
10
 
11
11
  file = ARGV[0] || 'MTK-tone_row_melody.mid'
12
12
 
@@ -14,8 +14,10 @@ row = PitchClassSet Db, G, Ab, F, Eb, E, D, C, B, Gb, A, Bb
14
14
  pitch_pattern = Patterns.Cycle *row
15
15
  rhythm_pattern = Patterns.Choice s, i, i+s, q # choose between sixteenth, eighth, dotted eighth, and quarter
16
16
 
17
- sequencer = Sequencers.LegatoSequencer pitch_pattern, rhythm_pattern, max_steps: 36
17
+ chain = Patterns.Chain pitch_pattern, rhythm_pattern, min_elements: 36, max_elements: 36
18
+
19
+ sequencer = Sequencers.LegatoSequencer chain
18
20
  timeline = sequencer.to_timeline
19
21
 
20
- MIDI_File(file).write timeline
22
+ MIDIFile(file).write timeline
21
23