kuromusic 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6bfa0bd38071a7eff140febd8dd6ecd0b306d36
4
- data.tar.gz: a56453eb5f4890ded06656a5951d0efc8f053ce4
3
+ metadata.gz: 88c575d4c2225a5beb8d75be9e12d85a8fb0d319
4
+ data.tar.gz: 73347be8d64387812c8f06b4371e76c81154d5e8
5
5
  SHA512:
6
- metadata.gz: 66ba15156b082ecf6a7e34e06d7086764d61efe202eea111a6e0b7781790cbbeec82aba8678db014268933da90acc40508af64579bab8899cb55e6c686903b71
7
- data.tar.gz: 99f38c4b27bfd4054f2ea1ced1feb5b4ec7f2c9fb3c5d393f786bda7bd6a3f9e008b775ad45e1e43d32a7f3994d618b88578c85274a5a73643130cf95c98c100
6
+ metadata.gz: 663b0c54a70421da648756bd07eb421db0bdf1cca094e61e4e08b9b07b57c0ba65cf22fd63e81764160b16aa5c22ecbe1b5768983ed19802e7ba8ec68496943e
7
+ data.tar.gz: aec00d04e584d9d925b405cdf470587a3df815cc6de092458177ec7de80995c55a620f7f883275eb83cd723f83907d8e48b711e802151c215d4e0cabf96fd4e4
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ *.mid
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  KuroMusic is midi controll library writed by ruby.
4
4
 
5
5
  ##version
6
- 0.0.1
6
+ 0.0.2
7
7
 
8
8
  ## Installation
9
9
 
@@ -28,15 +28,58 @@ you should require KuroMusic in your source code to use those method.
28
28
  require "KuroMusic"
29
29
  ```
30
30
 
31
- ###generate melody automaticaly
31
+ ###generating melody on yourself
32
+ ```ruby:
33
+ DELTA_TIME = 480
34
+ midi = Midi.new(DELTA_TIME, 1)
35
+ chords1 = [
36
+ Chord.new([Note.new("A", 4, 100, 480),Note.new("C", 4, 100, 480),Note.new("E", 4, 100, 480)]),
37
+ Chord.new([Note.new("B", 4, 100, 480),Note.new("D", 4, 100, 480),Note.new("F", 4, 100, 480)]),
38
+ Chord.new([Note.new("C", 4, 100, 480),Note.new("E", 4, 100, 480),Note.new("G", 4, 100, 480)]),
39
+ Chord.new([Note.new("D", 4, 100, 480),Note.new("F", 4, 100, 480),Note.new("A", 4, 100, 480)]),
40
+ ]
41
+ chords2 = [
42
+ Chord.new([Note.new("E", 4, 100, 480),Note.new("G", 4, 100, 480),Note.new("B", 4, 100, 480)]),
43
+ Chord.new([Note.new("F", 4, 100, 480),Note.new("A", 4, 100, 480),Note.new("C", 4, 100, 480)]),
44
+ Chord.new([Note.new("G", 4, 100, 480),Note.new("B", 4, 100, 480),Note.new("D", 4, 100, 480)]),
45
+ ]
46
+ midi.tracks[0] = Track.new(
47
+ [
48
+ Measure.new(chords1),
49
+ Measure.new(chords2)
50
+ ]
51
+ )
52
+ ```
53
+
54
+ ###generating melody automaticaly
32
55
  ```ruby:
33
56
  DELTA_TIME = 480
34
57
  midi = Midi.new(DELTA_TIME, 2)
35
- melo = MelodyGenerater.new(DELTA_TIME, Scale::MAJOR).extend(MelodyGenerater::Rand)
58
+ melo = MelodyGenerater.new(DELTA_TIME, Scale::MAJOR).extend(MelodyGenerater::Schenker)
36
59
  midi.tracks[0] = melo.cantus(10)
37
60
  midi.tracks[1] = melo.base(10)
38
61
  ```
39
62
 
63
+ ###changing tempo
64
+ ```ruby:
65
+ can = melo.cantus(10)
66
+ can[0].set_meta(Event::Meta::set_tempo(171))
67
+ ```
68
+
69
+ ###connecting tracks
70
+ ```ruby:
71
+ a_can = melo.cantus(10)
72
+ b_can = melo.cantus(10)
73
+ midi.tracks[0] = a_can + b_can
74
+ ```
75
+
76
+ ###connecting tracks
77
+ ```ruby:
78
+ a_can = melo.cantus(10)
79
+ b_can = melo.cantus(10)
80
+ midi.tracks[0] = a_can + b_can
81
+ ```
82
+
40
83
  ###write midi file
41
84
  ```ruby:
42
85
  Midi::IO.write("hoge3.mid", midi)
@@ -4,40 +4,32 @@ class MelodyGenerater
4
4
  def fiber(octave, notes, num)
5
5
  Fiber.new do |dur, velocity|
6
6
  while true do
7
- ons = (0..(num-1)).to_a.map{|item|
7
+ dur, velocity = Fiber.yield (0..(num-1)).to_a.map{|item|
8
8
  note = notes.sample
9
- [Event::Note::rest(0), Event::Note::on(note, octave, velocity)]
9
+ Note.new(note, octave, velocity, dur)
10
10
  }
11
- offs = ons.each_with_index.map{|item, i|
12
- if i == 0
13
- [Event::Note::rest(dur), Event::Note::off(item[1].args[:note], octave)]
14
- else
15
- [Event::Note::rest(0), Event::Note::off(item[1].args[:note], octave)]
16
- end
17
- }
18
- dur, velocity = Fiber.yield [ons, offs].flatten
19
11
  end
20
12
  end
21
13
  end
22
14
 
23
15
  def common(length, octave, _note_times, notes)
24
- events = []
25
16
  f = fiber(octave, notes, 2)
26
- length.times {|i|
17
+ (1..length).map {|i|
18
+ chords = []
27
19
  note_times = _note_times[0..(_note_times.length - 1)]
28
20
  dur = note_times.sample
29
- events.concat f.resume(dur, 100)
21
+ chords.push Chord.new(f.resume(dur, 100))
30
22
  _sub = @measure - dur
31
23
  note_times.reverse.each_with_index {|t, i|
32
24
  times = note_times[0..(note_times.length - 1 - i)]
33
25
  while _sub >= t do
34
26
  dur = times.sample
35
- events.concat f.resume(dur, 100)
27
+ chords.push Chord.new(f.resume(dur, 100))
36
28
  _sub = _sub - dur
37
29
  end
38
30
  }
31
+ Measure.new(chords)
39
32
  }
40
- events
41
33
  end
42
34
 
43
35
  public
@@ -8,45 +8,37 @@ class MelodyGenerater
8
8
  Fiber.new do |dur, velocity|
9
9
  while true do
10
10
  notes.each{|n|
11
- ons = (0..(num-1)).to_a.map{|item|
11
+ dur, velocity = Fiber.yield (0..(num-1)).to_a.map{|item|
12
12
  _n = n + (2 * item)
13
13
  octave = octave + _n / 12
14
14
  number = _n % 12
15
15
  note = Scale::number_to_code(number)
16
- [Event::Note::rest(0), Event::Note::on(note, octave, velocity)]
16
+ Note.new(note, octave, velocity, dur)
17
17
  }
18
- offs = ons.each_with_index.map{|item, i|
19
- if i == 0
20
- [Event::Note::rest(dur), Event::Note::off(item[1].args[:note], octave)]
21
- else
22
- [Event::Note::rest(0), Event::Note::off(item[1].args[:note], octave)]
23
- end
24
- }
25
- dur, velocity = Fiber.yield [ons, offs].flatten
26
18
  }
27
19
  end
28
20
  end
29
21
  end
30
22
 
31
23
  def common(length, octave, _note_times, notes)
32
- events = []
33
24
  f = fiber(octave, notes, 2)
34
- length.times {|i|
25
+ (1..length).map {|i|
26
+ chords = []
35
27
  note_times = _note_times[0..(_note_times.length - 1)]
36
28
  dur = note_times.sample
37
- events.concat f.resume(dur, 100)
29
+ chords.push Chord.new(f.resume(dur, 100))
38
30
  _sub = @measure - dur
39
31
  note_times.reverse.each_with_index {|t, i|
40
32
  times = note_times[0..(note_times.length - 1 - i)]
41
33
  while _sub >= t do
42
34
  note = @scale.sample
43
35
  dur = times.sample
44
- events.concat [Event::Note::rest(0), Event::Note::on(note, octave, 100), Event::Note::rest(dur), Event::Note::off(note, octave)]
36
+ chords.push Chord.new([Note.new(note, octave, 100, dur)])
45
37
  _sub = _sub - dur
46
38
  end
47
39
  }
40
+ Measure.new(chords)
48
41
  }
49
- events
50
42
  end
51
43
 
52
44
  public
@@ -0,0 +1,28 @@
1
+ require_relative "Event"
2
+
3
+ class Midi
4
+ private
5
+ module Chord
6
+ public
7
+ def to_bin()
8
+ predur = 0
9
+ ons = []
10
+ offs = []
11
+ maxdur = 0
12
+ @notes.sort {|a, b|
13
+ a.dur <=> b.dur
14
+ }.each {|n|
15
+ ons += [::Event::Note::rest(0), n.get_on_event]
16
+ maxdur = n.dur if maxdur < n.dur
17
+ }.each {|n|
18
+ currentdur = n.dur - predur
19
+ offs += [::Event::Note::rest(currentdur), n.get_off_event]
20
+ predur = n.dur
21
+ }
22
+ (ons + offs).map {|e|
23
+ e.extend(Midi::Event)
24
+ e.to_bin
25
+ }.flatten!
26
+ end
27
+ end
28
+ end
@@ -1,6 +1,6 @@
1
1
  class Midi
2
2
  private
3
- module MidiEvent
3
+ module Event
4
4
  private
5
5
  def var_len n
6
6
  n < 0x80 ? [n] : [(n>>7|0x80), n % 0x80]
@@ -8,13 +8,13 @@ class Midi
8
8
 
9
9
  def note_to_bin()
10
10
  case @args[:method]
11
- when Event::EventType::Note::REST
11
+ when ::Event::EventType::Note::REST
12
12
  dur = var_len(@args[:dur])
13
13
  return dur
14
- when Event::EventType::Note::OFF
14
+ when ::Event::EventType::Note::OFF
15
15
  note_num = NOTE[@args[:note]] + @args[:octave] * OCTAVE_UNIT
16
16
  return [0x80, note_num, 0]
17
- when Event::EventType::Note::ON
17
+ when ::Event::EventType::Note::ON
18
18
  note_num = NOTE[@args[:note]] + @args[:octave] * OCTAVE_UNIT
19
19
  return [0x90, note_num, @args[:velocity]]
20
20
  end
@@ -22,7 +22,7 @@ class Midi
22
22
 
23
23
  def meta_to_bin()
24
24
  case @args[:method]
25
- when Event::EventType::Meta::SET_TEMPO
25
+ when ::Event::EventType::Meta::SET_TEMPO
26
26
  tempo = 60000000 / @args[:tempo]
27
27
  return [0, 0xff, 0x51, 0x03, tempo >> 16, tempo >> 8, tempo % 256]
28
28
  end
@@ -33,9 +33,10 @@ class Midi
33
33
  OCTAVE_UNIT = 12
34
34
 
35
35
  def to_bin()
36
- if @args[:type] == Event::EventType::NOTE
36
+ #p self.args
37
+ if @args[:type] == ::Event::EventType::NOTE
37
38
  return note_to_bin
38
- elsif @args[:type] == Event::EventType::META
39
+ elsif @args[:type] == ::Event::EventType::META
39
40
  return meta_to_bin
40
41
  end
41
42
  end
@@ -0,0 +1,17 @@
1
+ require_relative "Chord"
2
+ require_relative "Event"
3
+
4
+ class Midi
5
+ private
6
+ module Measure
7
+ def to_bin()
8
+ @metas.map {|m|
9
+ m.extend(Midi::Event)
10
+ m.to_bin
11
+ }.flatten.concat @chords.map {|c|
12
+ c.extend(Midi::Chord)
13
+ c.to_bin
14
+ }.flatten!
15
+ end
16
+ end
17
+ end
@@ -1,11 +1,13 @@
1
+ require_relative "Measure"
2
+
1
3
  class Midi
2
4
  private
3
- module MidiTrack
5
+ module Track
4
6
  def to_bin()
5
7
  track = []
6
- @events.each {|e|
7
- e.extend(MidiEvent)
8
- track.concat e.to_bin
8
+ @measures.each {|m|
9
+ m.extend(Midi::Measure)
10
+ track.concat m.to_bin
9
11
  }
10
12
  tl = track.concat([0, 0xff, 0x02, 0]).size
11
13
  result = [0x4d, 0x54, 0x72, 0x6b, tl >> 24, tl >> 16, tl >> 8, tl % 256].concat track
@@ -1,5 +1,4 @@
1
- require_relative "MIDI/MidiEvent"
2
- require_relative "MIDI/MidiTrack"
1
+ require_relative "MIDI/Track"
3
2
 
4
3
  class Midi
5
4
  module IO
@@ -14,11 +13,11 @@ class Midi
14
13
  dtime = midi.dtime
15
14
  file.write [0x4d, 0x54, 0x68, 0x64, 0, 0, 0, 6, 0, 1, track_num >> 8, track_num % 256, dtime >> 8, dtime % 256].pack('C*')
16
15
  midi.tracks.each {|track|
17
- track.extend(MidiTrack)
16
+ track.extend(Midi::Track)
18
17
  m = track.to_bin
19
18
  track.each {|e|
20
19
  #[e.args[:type], e.args[:method], e.args[:note], e.args[:octave], e.args[:dur], e.args[:velocity]]
21
- p e.args
20
+ #p e.args
22
21
  }
23
22
  #p m
24
23
  file.write m.pack('C*')
@@ -10,7 +10,7 @@ class Midi
10
10
  end
11
11
 
12
12
  def initialize(dtime, track_num)
13
- @tracks = Array.new(track_num, Track.new([]))
13
+ @tracks = Array.new(track_num, ::Track.new([]))
14
14
  @dtime = dtime
15
15
  end
16
16
  end
@@ -1,4 +1,3 @@
1
- require_relative "Event"
2
1
  require_relative "Track"
3
2
 
4
3
  require_relative "Generator/Random"
@@ -8,4 +8,9 @@ class Event
8
8
  def initialize(args)
9
9
  @args = args
10
10
  end
11
+
12
+ public
13
+ def inspect()
14
+ "< " + @args.to_s + " >"
15
+ end
11
16
  end
@@ -0,0 +1,24 @@
1
+ require_relative "Note/Event"
2
+
3
+ class Note < Object
4
+ attr_reader :note, :octave, :velocity, :dur
5
+ public
6
+ def initialize(note, octave, velocity, dur)
7
+ @note = note
8
+ @octave = octave
9
+ @dur = dur
10
+ @velocity = velocity
11
+ end
12
+
13
+ def get_on_event()
14
+ Event::Note::on(@note, @octave, @velocity)
15
+ end
16
+
17
+ def get_off_event()
18
+ Event::Note::off(@note, @octave)
19
+ end
20
+
21
+ def inspect()
22
+ "<:note=>" + @note + ", :octave=>" + @octave.to_s + ", :velocity:=>" + @velocity.to_s + ", :duration=>" + @dur.to_s + ">"
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "Chord/Note"
2
+
3
+ class Chord < Object
4
+ def initialize(notes = [])
5
+ @notes = notes
6
+ end
7
+
8
+ def inspect()
9
+ @notes.map{|n| n.inspect}.join(",\n ")
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ require_relative "Measure/Chord"
2
+
3
+ class Measure < Object
4
+ def initialize(chords = [], metas = [])
5
+ @chords = chords
6
+ @metas = metas
7
+ end
8
+
9
+ def set_meta(meta_event)
10
+ if meta_event.class.to_s != "Event"
11
+ self.error_puts("ArgumentTypeError", "undefined method `+'")
12
+ elsif meta_event.args[:type] != Event::EventType::META
13
+ self.error_puts("EventTypeError", "undefined method `+'")
14
+ end
15
+ @metas.push(meta_event)
16
+ self
17
+ end
18
+
19
+ def inspect()
20
+ "
21
+ " + @metas.map{|m| m.inspect}.join("\n ),\n (\n ") + "
22
+ (
23
+ " + @chords.map{|m| m.inspect}.join("\n ),\n (\n ") + "
24
+ )"
25
+ end
26
+ end
@@ -1,17 +1,18 @@
1
1
  require_relative "Object"
2
+ require_relative "Track/Measure"
2
3
 
3
4
  class Track < Object
4
- def initialize(events = [])
5
- @events = events
5
+ def initialize(measures = [])
6
+ @measures = measures
6
7
  end
7
8
 
8
9
  def [](index)
9
- @events[index]
10
+ @measures[index]
10
11
  end
11
12
 
12
13
  def []=(index, obj)
13
- if obj.class.to_s == "Event"
14
- @events[index] = obj
14
+ if obj.class.to_s == "Measure"
15
+ @measures[index] = obj
15
16
  else
16
17
  self.error_puts("ArgumentTypeError", "undefined method `+'")
17
18
  end
@@ -19,16 +20,16 @@ class Track < Object
19
20
 
20
21
  def insert(index, *objs)
21
22
  objs.each {|e|
22
- if e.class.to_s != "Event"
23
+ if e.class.to_s != "Measure"
23
24
  self.error_puts("ArgumentTypeError", "undefined method `+'")
24
25
  end
25
26
  }
26
- @events.insert(index, *objs)
27
+ @measures.insert(index, *objs)
27
28
  end
28
29
 
29
30
  def push(obj)
30
- if obj.class.to_s == "Event"
31
- @events.push(obj)
31
+ if obj.class.to_s == "Measure"
32
+ @measures.push(obj)
32
33
  else
33
34
  self.error_puts("ArgumentTypeError", "undefined method `+'")
34
35
  end
@@ -36,8 +37,8 @@ class Track < Object
36
37
  end
37
38
 
38
39
  def unshift(obj)
39
- if obj.class.to_s == "Event"
40
- @events.unshift(obj)
40
+ if obj.class.to_s == "Measure"
41
+ @measures.unshift(obj)
41
42
  else
42
43
  self.error_puts("ArgumentTypeError", "undefined method `+'")
43
44
  end
@@ -45,26 +46,26 @@ class Track < Object
45
46
  end
46
47
 
47
48
  def each()
48
- @events.each {|e|
49
+ @measures.each {|e|
49
50
  yield(e)
50
51
  }
51
52
  end
52
53
 
53
54
  def each_with_index()
54
- @events.each {|e|
55
+ @measures.each {|e|
55
56
  yield(e)
56
57
  }
57
58
  end
58
59
 
59
60
  def map()
60
- result = @events.map {|e|
61
+ result = @measures.map {|e|
61
62
  yield(e)
62
63
  }
63
64
  Track.new(result)
64
65
  end
65
66
 
66
67
  def map!()
67
- @events.map! {|e|
68
+ @measures.map! {|e|
68
69
  yield(e)
69
70
  }
70
71
  end
@@ -72,7 +73,7 @@ class Track < Object
72
73
  def +(other)
73
74
  tmp = []
74
75
  if other.class.to_s == "Track"
75
- tmp.push(@events)
76
+ tmp.push(@measures)
76
77
  other.each{|e|
77
78
  tmp.push(e)
78
79
  }
@@ -82,4 +83,10 @@ class Track < Object
82
83
  end
83
84
  Track.new(tmp)
84
85
  end
86
+
87
+ def inspect()
88
+ "[
89
+ " + @measures.map{|m| m.inspect}.join("\n ----------------------------------------------------------\n ") + "
90
+ ]"
91
+ end
85
92
  end
@@ -1,3 +1,3 @@
1
1
  module Kuromusic
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/kuromusic.rb CHANGED
@@ -1,4 +1,5 @@
1
- require "kuromusic/version"
1
+ require_relative "kuromusic/version"
2
2
  require_relative "kuromusic/MIDI"
3
3
  require_relative "kuromusic/Scale"
4
+ require_relative "kuromusic/Track"
4
5
  require_relative "kuromusic/MelodyGenerater"
data/lib/sample/main.rb CHANGED
@@ -2,15 +2,17 @@ require_relative "../KuroMusic"
2
2
 
3
3
  DELTA_TIME = 480
4
4
  midi = Midi.new(DELTA_TIME, 2)
5
- melo = MelodyGenerater.new(DELTA_TIME, Scale::MAJOR, []).extend(MelodyGenerater::Schenker)
5
+ melo = MelodyGenerater.new(DELTA_TIME, Scale::MAJOR).extend(MelodyGenerater::Schenker)
6
6
 
7
- a_can = melo.cantus(5).unshift(Event::Meta::set_tempo(171))
8
- b_can = melo.cantus(5)#.unshift(Event::Meta::set_tempo(140))
9
- s_can = melo.cantus(10)#.unshift(Event::Meta::set_tempo(190))
7
+ a_can = melo.cantus(5)
8
+ a_can[0].set_meta(Event::Meta::set_tempo(171))
9
+ b_can = melo.cantus(5)
10
+ s_can = melo.cantus(10)
10
11
 
11
- a_bas = melo.base(5).unshift(Event::Meta::set_tempo(171))
12
- b_bas = melo.base(5)#.unshift(Event::Meta::set_tempo(140))
13
- s_bas = melo.base(10)#.unshift(Event::Meta::set_tempo(190))
12
+ a_bas = melo.base(5)
13
+ a_bas[0].set_meta(Event::Meta::set_tempo(171))
14
+ b_bas = melo.base(5)
15
+ s_bas = melo.base(10)
14
16
 
15
17
  midi.tracks[0] = a_can + b_can + s_can + a_can + b_can + s_can + a_can
16
18
  midi.tracks[1] = a_bas + b_bas + s_bas + a_bas + b_bas + s_bas + a_bas
@@ -0,0 +1,25 @@
1
+ require_relative "../KuroMusic"
2
+
3
+ DELTA_TIME = 480
4
+ midi = Midi.new(DELTA_TIME, 1)
5
+ chords1 = [
6
+ Chord.new([Note.new("A", 4, 100, 480),Note.new("C", 4, 100, 480),Note.new("E", 4, 100, 480)]),
7
+ Chord.new([Note.new("B", 4, 100, 480),Note.new("D", 4, 100, 480),Note.new("F", 4, 100, 480)]),
8
+ Chord.new([Note.new("C", 4, 100, 480),Note.new("E", 4, 100, 480),Note.new("G", 4, 100, 480)]),
9
+ Chord.new([Note.new("D", 4, 100, 480),Note.new("F", 4, 100, 480),Note.new("A", 4, 100, 480)]),
10
+ ]
11
+ chords2 = [
12
+ Chord.new([Note.new("E", 4, 100, 480),Note.new("G", 4, 100, 480),Note.new("B", 4, 100, 480)]),
13
+ Chord.new([Note.new("F", 4, 100, 480),Note.new("A", 4, 100, 480),Note.new("C", 4, 100, 480)]),
14
+ Chord.new([Note.new("G", 4, 100, 480),Note.new("B", 4, 100, 480),Note.new("D", 4, 100, 480)]),
15
+ ]
16
+ midi.tracks[0] = Track.new(
17
+ [
18
+ Measure.new(chords1),
19
+ Measure.new(chords2)
20
+ ]
21
+ )
22
+
23
+ p midi.tracks[0]
24
+
25
+ Midi::IO.write("../../hoge3.mid", midi)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kuromusic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - "黒澤 預生"
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-23 00:00:00.000000000 Z
11
+ date: 2016-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,23 +53,29 @@ files:
53
53
  - kuromusic.gemspec
54
54
  - lib/kuromusic.rb
55
55
  - lib/kuromusic/ChordProgressionGenerator.rb
56
- - lib/kuromusic/Event.rb
57
- - lib/kuromusic/Event/EventType.rb
58
- - lib/kuromusic/Event/MetaEvent.rb
59
- - lib/kuromusic/Event/NoteEvent.rb
60
56
  - lib/kuromusic/Generator/Random.rb
61
57
  - lib/kuromusic/Generator/Schenker.rb
62
58
  - lib/kuromusic/IO/MIDI.rb
63
- - lib/kuromusic/IO/MIDI/MidiEvent.rb
64
- - lib/kuromusic/IO/MIDI/MidiTrack.rb
59
+ - lib/kuromusic/IO/MIDI/Chord.rb
60
+ - lib/kuromusic/IO/MIDI/Event.rb
61
+ - lib/kuromusic/IO/MIDI/Measure.rb
62
+ - lib/kuromusic/IO/MIDI/Track.rb
65
63
  - lib/kuromusic/Key.rb
66
64
  - lib/kuromusic/MIDI.rb
67
65
  - lib/kuromusic/MelodyGenerater.rb
68
66
  - lib/kuromusic/Object.rb
69
67
  - lib/kuromusic/Scale.rb
70
68
  - lib/kuromusic/Track.rb
69
+ - lib/kuromusic/Track/Measure.rb
70
+ - lib/kuromusic/Track/Measure/Chord.rb
71
+ - lib/kuromusic/Track/Measure/Chord/Note.rb
72
+ - lib/kuromusic/Track/Measure/Chord/Note/Event.rb
73
+ - lib/kuromusic/Track/Measure/Chord/Note/Event/EventType.rb
74
+ - lib/kuromusic/Track/Measure/Chord/Note/Event/MetaEvent.rb
75
+ - lib/kuromusic/Track/Measure/Chord/Note/Event/NoteEvent.rb
71
76
  - lib/kuromusic/version.rb
72
77
  - lib/sample/main.rb
78
+ - lib/sample/main2.rb
73
79
  homepage: ''
74
80
  licenses:
75
81
  - MIT