zgomot 0.1.3 → 1.0.0

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 (64) hide show
  1. data/.rvmrc +1 -1
  2. data/README.rdoc +191 -98
  3. data/Rakefile +2 -0
  4. data/VERSION +1 -1
  5. data/bin/zgomot +1 -1
  6. data/examples/arp_chords.rb +1 -4
  7. data/examples/delay.rb +16 -0
  8. data/examples/full_scale_notes.rb +2 -5
  9. data/examples/inv_chords.rb +1 -4
  10. data/examples/modes_notes.rb +2 -5
  11. data/examples/notes.rb +1 -5
  12. data/examples/percs.rb +4 -8
  13. data/examples/percs_multi.rb +1 -5
  14. data/examples/phase_notes.rb +4 -8
  15. data/examples/prog_chords.rb +2 -5
  16. data/examples/prog_chords_multi_vel_length.rb +1 -4
  17. data/examples/prog_chords_rest.rb +1 -4
  18. data/examples/prog_notes.rb +1 -4
  19. data/examples/prog_notes_multi_vel_length.rb +1 -4
  20. data/examples/prog_notes_rest.rb +1 -4
  21. data/examples/progressive_modes.rb +10 -18
  22. data/examples/reverse_chords.rb +1 -4
  23. data/examples/route_chords.rb +22 -0
  24. data/examples/scale_chords.rb +1 -4
  25. data/examples/scale_notes.rb +1 -4
  26. data/examples/scales_notes.rb +1 -5
  27. data/examples/simple_chords.rb +1 -4
  28. data/examples/simple_input.rb +21 -0
  29. data/examples/simple_markov.rb +1 -5
  30. data/examples/simple_notes.rb +2 -5
  31. data/examples/zgomot_streams.rb +19 -0
  32. data/lib/zgomot/boot.rb +5 -31
  33. data/lib/zgomot/comp/chord.rb +16 -70
  34. data/lib/zgomot/comp/markov.rb +8 -26
  35. data/lib/zgomot/comp/mode.rb +9 -32
  36. data/lib/zgomot/comp/note.rb +1 -16
  37. data/lib/zgomot/comp/pattern.rb +1 -24
  38. data/lib/zgomot/comp/permutation.rb +0 -11
  39. data/lib/zgomot/comp/pitch_class.rb +3 -28
  40. data/lib/zgomot/comp/progression.rb +15 -49
  41. data/lib/zgomot/comp/scale.rb +5 -14
  42. data/lib/zgomot/config.rb +3 -18
  43. data/lib/zgomot/drivers/core_midi.rb +129 -92
  44. data/lib/zgomot/drivers/driver.rb +2 -15
  45. data/lib/zgomot/drivers/mgr.rb +5 -21
  46. data/lib/zgomot/main.rb +13 -24
  47. data/lib/zgomot/midi/cc.rb +67 -0
  48. data/lib/zgomot/midi/channel.rb +20 -50
  49. data/lib/zgomot/midi/clock.rb +21 -48
  50. data/lib/zgomot/midi/dispatcher.rb +13 -26
  51. data/lib/zgomot/midi/note.rb +11 -34
  52. data/lib/zgomot/midi/stream.rb +82 -43
  53. data/lib/zgomot/midi.rb +1 -0
  54. data/lib/zgomot/ui/output.rb +67 -0
  55. data/lib/zgomot/ui/windows.rb +359 -0
  56. data/lib/zgomot/ui.rb +3 -0
  57. data/lib/zgomot.rb +6 -1
  58. data/lib/{zlive.rb → zgomot_sh.rb} +1 -0
  59. data/zgomot.gems +14 -0
  60. data/zgomot.gemspec +26 -14
  61. metadata +52 -9
  62. data/default.gems +0 -7
  63. data/examples/simple_notes_length.rb +0 -17
  64. data/examples/simple_notes_velocity.rb +0 -17
@@ -1,18 +1,14 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  score = [pr([:acoustic_bass_drum, :cowbell]), pr(:R), pr([:acoustic_snare, :hand_clap]), pr(:R)]
11
9
 
12
- #.........................................................................................................
13
10
  str 'percussion', score, :lim=>:inf do |pattern|
14
- ch(2) << pattern
11
+ pattern
15
12
  end
16
13
 
17
- #.........................................................................................................
18
14
  play
@@ -1,20 +1,16 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
- str 'melody-1', np([:B,3],nil,:l=>4)[1,4,5,5], :lim=>:inf do |pattern|
11
- ch(0) << pattern.mode!((count/4) % 7 + 1)
8
+ str 'melody-1', np([:B,3],nil,:l=>4)[1,4,5,5], :lim=>:inf, :ch => 0 do |pattern|
9
+ pattern.mode!((count/4) % 7 + 1)
12
10
  end
13
11
 
14
- #.........................................................................................................
15
- str 'melody-2', np([:B,3],:ionian,:l=>4)[1,4,5,5].bpm!(16.0/15.0), :lim=>:inf do |pattern|
16
- ch(1) << pattern
12
+ str 'melody-2', np([:B,3],:ionian,:l=>4)[1,4,5,5].bpm!(16.0/15.0), :lim=>:inf, :ch => 1 do |pattern|
13
+ pattern
17
14
  end
18
15
 
19
- #.........................................................................................................
20
16
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
- str 'prog', cp([:B,3],:ionian,:l=>4)[1,4,5,5], :lim=>1 do |pattern|
11
- ch << pattern
8
+ str 'prog', cp([:B,3],:ionian,:l=>4)[1,4,5,5], :lim=>6 do |pattern|
9
+ pattern
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'prog', cp([:A,4],nil,:l=>[4,4,8,8,4], :v=>[0.6, 0.4, 0.7, 0.6, 0.4])[7,5,3,3,1], :lim=>6 do |pattern|
11
- ch << pattern.mode!(count)
9
+ pattern.mode!(count)
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'prog', cp([:B,3],:ionian,:l=>4)[1,4,:R,5], :lim=>1 do |pattern|
11
- ch << pattern
9
+ pattern
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'prog', np([:A,4],nil,:l=>4)[7,5,3,1], :lim=>6 do |pattern|
11
- ch << pattern.mode!(count)
9
+ pattern.mode!(count)
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'prog', np([:A,4],nil,:l=>[4,4,8,8,4], :v=>[0.6, 0.4, 0.7, 0.6, 0.4])[7,5,3,3,1], :lim=>6 do |pattern|
11
- ch << pattern.mode!(count)
9
+ pattern.mode!(count)
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'prog', np([:A,4],nil,:l=>4)[7,:R,3,1], :lim=>6 do |pattern|
11
- ch << pattern.mode!(count)
9
+ pattern.mode!(count)
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,16 +1,13 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
- major_modes = [:ionian, :lydian, :mixolydian]
8
+ major_modes = [:ionian, :lydian, :mixolydian]
11
9
  minor_modes = [:dorian, :phrygian, :aeolian]
12
10
 
13
- #.........................................................................................................
14
11
  m_slow = mark
15
12
  m_slow.add([0.6, 0.4]) do |count|
16
13
  np([:A,4],major_modes[count % 3],:l=>4)[7,5,3,1]
@@ -19,12 +16,10 @@ m_slow.add([0.4, 0.6]) do |count|
19
16
  np([:A,4],minor_modes[count % 3],:l=>4)[7,5,3,1]
20
17
  end
21
18
 
22
- #.........................................................................................................
23
19
  str :slow do
24
- ch(0) << m_slow.next(count)
20
+ m_slow.next(count)
25
21
  end
26
22
 
27
- #.........................................................................................................
28
23
  m_fast = mark
29
24
  m_fast.add([0.6, 0.4]) do |count|
30
25
  np([:G,4],major_modes[count % 3],:l=>4)[7,5,3,1].bpm!(16.0/15.0)
@@ -33,19 +28,16 @@ m_fast.add([0.4, 0.6]) do |count|
33
28
  np([:G,4],minor_modes[count % 3],:l=>4)[7,5,3,1].bpm!(16.0/15.0)
34
29
  end
35
30
 
36
- #.........................................................................................................
37
- str :fast do
38
- ch(1) << m_fast.next(count)
31
+ str :fast, nil, :ch => 1 do
32
+ m_fast.next(count)
39
33
  end
40
34
 
41
- #.........................................................................................................
42
- str :perc do
43
- ch(2) << if (count % 2).eql?(0)
44
- [pr(:R, :l=>2), pr(:hand_clap), pr(:hand_clap)]
45
- else
46
- pr(:R,:l=>1)
47
- end
35
+ str :perc, nil, :ch => 2 do
36
+ if (count % 2).eql?(0)
37
+ [pr(:R, :l=>2), pr(:hand_clap), pr(:hand_clap)]
38
+ else
39
+ pr(:R,:l=>1)
40
+ end
48
41
  end
49
42
 
50
- #.........................................................................................................
51
43
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'chords', [c(:C,:min).arp!(4), c(:C,:min).arp!(4).rev!, c(:E,:min).arp!(4), c(:E,:min).arp!(4).rev!], :lim=>3 do |pattern|
11
- ch << pattern
9
+ pattern
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
+
4
+ before_start do
5
+ Zgomot.logger.level = Logger::DEBUG
6
+ end
7
+
8
+ chords = cp([:B,3],:ionian,:l=>4)[1,4,5,5]
9
+
10
+ str 'note-0', chords.note(0), :ch=>0 do |pattern|
11
+ pattern
12
+ end
13
+
14
+ str 'note-1', chords.note(1), :ch=>1 do |pattern|
15
+ pattern
16
+ end
17
+
18
+ str 'note-2', chords.note(2), :ch=>2 do |pattern|
19
+ pattern
20
+ end
21
+
22
+ run
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'scale', cp([:C,4],:ionian,:l=>4), :lim=>1 do |pattern|
11
- ch << pattern
9
+ pattern
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'scale', [np([:C,4],:dorian,:l=>4), np([:C,4],:dorian,:l=>4).reverse!.shift, n(:R)], :lim=>3 do |pattern|
11
- ch << pattern
9
+ pattern
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -1,19 +1,15 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  pclass = [:C, :Cs, :D, :Ds, :E, :F, :Fs, :G, :Gs, :A, :As, :B]
11
9
 
12
- #.........................................................................................................
13
10
  str 'scale', [np(nil,:dorian,:l=>4), np(nil,:dorian,:l=>4).reverse!.shift, n(:R)], :lim=>pclass.length do |pattern|
14
11
  Zgomot.logger.info "TONIC: [#{pclass[count-1]},4], MODE: dorian"
15
- ch << pattern.tonic!([pclass[count-1], 4])
12
+ pattern.tonic!([pclass[count-1], 4])
16
13
  end
17
14
 
18
- #.........................................................................................................
19
15
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'chords', [ c(:C), c(:E,:min), c(:D,:min), c(:B,:dim), c(:G,:maj)], :lim=>3 do |pattern|
11
- ch << pattern
9
+ pattern
12
10
  end
13
11
 
14
- #.........................................................................................................
15
12
  play
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
+
4
+ before_start do
5
+ Zgomot.logger.level = Logger::DEBUG
6
+ end
7
+
8
+ if sources.include?("nanoKONTROL")
9
+ add_input("nanoKONTROL")
10
+ add_cc(:mode, 17, :type => :cont, :min => 0, :max => 6, :init => 0)
11
+ add_cc(:reverse, 13, :type => :switch)
12
+ str 'simple_input', np([:A,4],2,:l=>4)[7,5,3,1] do |pattern|
13
+ if cc(:reverse)
14
+ pattern.mode!(cc(:mode).to_i).reverse!
15
+ else
16
+ pattern.mode!(cc(:mode).to_i)
17
+ end
18
+ end
19
+ play
20
+ end
21
+
@@ -1,12 +1,10 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  m = mark
11
9
  m.add([0.6, 0.4]) do
12
10
  np([:A,4],:dorian,:l=>4)[7,5,3,1,]
@@ -15,10 +13,8 @@ m.add([0.4, 0.6]) do
15
13
  np([:A,4],:ionian,:l=>4)[7,5,3,1]
16
14
  end
17
15
 
18
- #.........................................................................................................
19
16
  str 'markov' do
20
- ch << m.next
17
+ m.next
21
18
  end
22
19
 
23
- #.........................................................................................................
24
20
  play
@@ -1,15 +1,12 @@
1
1
  require 'rubygems'
2
2
  require "#{File.dirname(__FILE__)}/../lib/zgomot"
3
3
 
4
- #.........................................................................................................
5
4
  before_start do
6
5
  Zgomot.logger.level = Logger::DEBUG
7
6
  end
8
7
 
9
- #.........................................................................................................
10
8
  str 'notes' do
11
- ch << [n([:C,5]), n(:B), n(:R), n(:G), n(:C,:l=>2), n([:E,5],:l=>2)]
9
+ [n([:C,5]), n(:B), n(:R), n(:G), n(:C,:l=>2), n([:E,5],:l=>2)]
12
10
  end
13
11
 
14
- #.........................................................................................................
15
- play
12
+ play
@@ -0,0 +1,19 @@
1
+ set_config(:beats_per_minute=>120, :time_signature=>"4/4", :resolution=>"1/64")
2
+
3
+ add_input("nanoKONTROL") if sources.include?("nanoKONTROL")
4
+ add_cc(:mode, 17, :type => :cont, :min => 0, :max => 6, :init => 0)
5
+ add_cc(:reverse, 13, :type => :switch)
6
+
7
+
8
+ str 'input', np([:A,4],2,:l=>4)[7,5,3,1], :ch=>0 do |pattern|
9
+ if cc(:reverse)
10
+ pattern.mode!(cc(:mode).to_i).reverse!
11
+ else
12
+ pattern.mode!(cc(:mode).to_i)
13
+ end
14
+ end
15
+
16
+ str 'chords', cp([:B,3],:ionian,:l=>4)[1,4,5,5], :lim=>6, :ch=>1 do |pattern|
17
+ pattern
18
+ end
19
+
data/lib/zgomot/boot.rb CHANGED
@@ -1,56 +1,30 @@
1
- ##############################################################################################################
2
1
  module Zgomot
3
2
 
4
- #####-------------------------------------------------------------------------------------------------------
5
3
  class Boot
6
-
7
- ####......................................................................................................
8
4
  class << self
9
-
10
- #.......................................................................................................
11
5
  def boot
12
-
13
- ####..............
14
6
  Zgomot.logger = Logger.new(STDOUT)
15
- Zgomot.logger.level = Logger::WARN
16
-
17
- ####..............
7
+ Zgomot.logger.level = Logger::WARN
18
8
  call_if_implemented(:call_before_start)
19
-
20
- ####..............
21
9
  Zgomot.logger.info "ZGOMOT BEGINNING"
22
10
  Zgomot.logger.info "APPLICATION PATH: #{Zgomot.app_path}"
23
11
  Zgomot.logger.info "CONFIGURATION FILE: #{Zgomot.config_file}"
24
- Zgomot.logger.info "CONFIGURATION: #{Zgomot.config.inspect}"
25
-
12
+ Zgomot.logger.info "CONFIGURATION: #{Zgomot.config.inspect}"
26
13
  end
27
-
28
- ####....................................................................................................
29
- # application deligate methods
30
- #.......................................................................................................
31
14
  def call_if_implemented(method, *args)
32
15
  send(method, *args) if respond_to?(method)
33
16
  end
34
-
35
- #.........................................................................................................
36
17
  def callbacks(*args)
37
- args.each do |meth|
18
+ args.each do |meth|
38
19
  instance_eval <<-do_eval
39
20
  def #{meth}(&blk)
40
21
  define_meta_class_method(:call_#{meth}, &blk)
41
22
  end
42
23
  do_eval
43
24
  end
44
- end
45
-
46
- #### self
25
+ end
47
26
  end
48
-
49
- #.........................................................................................................
50
27
  callbacks(:before_start)
51
-
52
- #### Boot
53
28
  end
54
-
55
- #### Zgomot
29
+
56
30
  end
@@ -1,41 +1,28 @@
1
- ##############################################################################################################
2
1
  module Zgomot::Comp
3
2
 
4
- #####-------------------------------------------------------------------------------------------------------
5
3
  class Chord
6
4
 
7
- #####-------------------------------------------------------------------------------------------------------
8
- # progession interface
9
- #####-------------------------------------------------------------------------------------------------------
10
5
  class Progression
11
-
12
- #.........................................................................................................
13
- attr_reader :chord
14
6
 
15
- #.........................................................................................................
7
+ attr_reader :chord
16
8
  def initialize(chord)
17
9
  @chord = chord || :scale
18
10
  end
19
-
20
- #.........................................................................................................
21
11
  def notes(prog)
22
12
  chords = prog.mode.chords(chord); count = -1
23
- prog.items.select do |d|
13
+ prog.items.select do |d|
24
14
  d.eql?(:R) || chords[d-1]
25
15
  end.map do |d|
26
16
  count += 1; idx_length, idx_velocity = count % prog.length.length, count % prog.velocity.length
27
17
  unless d.eql?(:R)
28
18
  Chord.new(:tonic => prog.pitches[d-1], :chord => chords[d-1], :length => prog.length[idx_length], :velocity => prog.velocity[idx_velocity])
29
19
  else
30
- Zgomot::Midi::Note.new(:pitch => :R, :length => prog.length[idx_length], :velocity => prog.velocity[idx_velocity])
20
+ Zgomot::Midi::Note.new(:pitch => :R, :length => prog.length[idx_length], :velocity => prog.velocity[idx_velocity])
31
21
  end
32
22
  end
33
23
  end
34
-
35
- #### Progression
36
24
  end
37
25
 
38
- #.........................................................................................................
39
26
  @chord_intervals = {
40
27
  :maj => [4,7],
41
28
  :min => [3,7],
@@ -44,24 +31,17 @@ module Zgomot::Comp
44
31
  :sus2 => [2,7],
45
32
  :sus4 => [5,7]
46
33
  }
47
-
48
- #####-------------------------------------------------------------------------------------------------------
34
+
49
35
  class << self
50
-
51
- #.........................................................................................................
52
36
  attr_reader :chord_intervals
53
-
54
- #### self
55
37
  end
56
-
57
- #.........................................................................................................
38
+
58
39
  attr_reader :tonic, :chord, :clock, :intervals, :arp, :time_scale, :items, :inversion, :reverse
59
40
  attr_accessor :length, :velocity
60
-
61
- #.........................................................................................................
41
+
62
42
  def initialize(args)
63
43
  @length, @velocity, @chord = args[:length], args[:velocity], args[:chord]
64
- (@intervals = Chord.chord_intervals[chord]) || raise(Zgomot::Error, "#{chord.inspect} is invalid")
44
+ (@intervals = Chord.chord_intervals[chord]) || raise(Zgomot::Error, "#{chord.inspect} is invalid")
65
45
  @time_scale, @inversion, @reverse = 1.0, 0, false
66
46
  @tonic = case args[:tonic]
67
47
  when Array then args[:tonic]
@@ -71,101 +51,67 @@ module Zgomot::Comp
71
51
  end
72
52
  end
73
53
 
74
- #.........................................................................................................
75
54
  def pitches
76
55
  last_pitch, octave = tonic; pitches = [tonic]
77
56
  intervals.each_index{|i| pitches << PitchClass.next(tonic.first, intervals[i])}
78
57
  nts = pitches[1..-1].map do |p|
79
58
  octave += 1 if p < last_pitch; last_pitch = p.value; [last_pitch, octave]
80
59
  end.unshift(tonic)
81
- @reverse ? invert(nts).reverse : invert(nts)
60
+ @reverse ? invert(nts).reverse : invert(nts)
61
+ end
62
+ def note(number)
63
+ Zgomot::Midi::Note.new(:pitch => pitches[number], :length => length, :velocity => velocity)
82
64
  end
83
-
84
- #.........................................................................................................
85
65
  def notes
86
- @notes ||= pitches.map do |p|
66
+ @notes ||= pitches.map do |p|
87
67
  Zgomot::Midi::Note.new(:pitch => p, :length => length, :velocity => velocity)
88
- end
68
+ end
89
69
  end
90
-
91
- #.........................................................................................................
92
- # transforms
93
- #.........................................................................................................
94
70
  def arp!(v)
95
71
  @notes = nil; @arp = v; self
96
72
  end
97
-
98
- #.........................................................................................................
99
73
  def inv!(v)
100
74
  @notes = nil; @inversion = v; self
101
75
  end
102
-
103
- #.........................................................................................................
104
76
  def rev!
105
77
  @reverse = true; self
106
78
  end
107
-
108
- #.........................................................................................................
109
79
  def bpm!(v)
110
80
  @time_scale = 1.0/v.to_f; self
111
81
  end
112
-
113
- #.........................................................................................................
114
82
  def octave!(v)
115
83
  @notes = nil; @octave = v; self
116
84
  end
117
-
118
- #.........................................................................................................
119
- # channel and dispatch interface
120
- #.........................................................................................................
121
85
  def length_to_sec
122
86
  time_scale*Zgomot::Midi::Clock.whole_note_sec*(1.0/length + (arp.to_f.eql?(0.0) ? 0.0 : intervals.length.to_f/arp.to_f))
123
87
  end
124
-
125
- #.........................................................................................................
126
88
  def to_midi
127
89
  notes.map{|n| n.to_midi}
128
90
  end
129
-
130
- #.........................................................................................................
131
91
  def channel=(chan)
132
92
  notes.each{|n| n.channel = chan}
133
93
  end
134
-
135
- #.........................................................................................................
136
94
  def offset_time=(time)
137
95
  notes.each{|n| n.offset_time = time}
138
96
  end
139
-
140
- #.........................................................................................................
141
97
  def time=(time)
142
98
  @clock = Zgomot::Midi::Clock.new
143
99
  clock.update(time)
144
100
  notes.each do |n|
145
101
  n.time = clock.current_time
146
- clock.update(Zgomot::Midi::Clock.whole_note_sec/arp.to_f) if arp.to_f > 0.0
102
+ clock.update(Zgomot::Midi::Clock.whole_note_sec/arp.to_f) if arp.to_f > 0.0
147
103
  end
148
104
  end
149
-
150
- #.........................................................................................................
151
- # private
152
- #.........................................................................................................
153
105
  def sum(a)
154
106
  a.inject(0) {|s,n| s+n}
155
107
  end
156
-
157
- #.........................................................................................................
158
108
  def invert(p)
159
109
  inversion.times do |i|
160
- n = p.shift; p.push([n.first, (n.last.eql?(9) ? n.last : n.last+1)])
110
+ n = p.shift; p.push([n.first, (n.last.eql?(9) ? n.last : n.last+1)])
161
111
  end; p
162
112
  end
163
-
164
- #.........................................................................................................
165
113
  private :sum, :invert
166
-
167
- #### Chord
114
+
168
115
  end
169
116
 
170
- #### Zgomot::Comp
171
117
  end