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 +4 -4
- data/.gitignore +1 -0
- data/README.md +46 -3
- data/lib/kuromusic/Generator/Random.rb +7 -15
- data/lib/kuromusic/Generator/Schenker.rb +7 -15
- data/lib/kuromusic/IO/MIDI/Chord.rb +28 -0
- data/lib/kuromusic/IO/MIDI/{MidiEvent.rb → Event.rb} +8 -7
- data/lib/kuromusic/IO/MIDI/Measure.rb +17 -0
- data/lib/kuromusic/IO/MIDI/{MidiTrack.rb → Track.rb} +6 -4
- data/lib/kuromusic/IO/MIDI.rb +3 -4
- data/lib/kuromusic/MIDI.rb +1 -1
- data/lib/kuromusic/MelodyGenerater.rb +0 -1
- data/lib/kuromusic/{Event → Track/Measure/Chord/Note/Event}/EventType.rb +0 -0
- data/lib/kuromusic/{Event → Track/Measure/Chord/Note/Event}/MetaEvent.rb +0 -0
- data/lib/kuromusic/{Event → Track/Measure/Chord/Note/Event}/NoteEvent.rb +0 -0
- data/lib/kuromusic/{Event.rb → Track/Measure/Chord/Note/Event.rb} +5 -0
- data/lib/kuromusic/Track/Measure/Chord/Note.rb +24 -0
- data/lib/kuromusic/Track/Measure/Chord.rb +11 -0
- data/lib/kuromusic/Track/Measure.rb +26 -0
- data/lib/kuromusic/Track.rb +23 -16
- data/lib/kuromusic/version.rb +1 -1
- data/lib/kuromusic.rb +2 -1
- data/lib/sample/main.rb +9 -7
- data/lib/sample/main2.rb +25 -0
- metadata +14 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88c575d4c2225a5beb8d75be9e12d85a8fb0d319
|
4
|
+
data.tar.gz: 73347be8d64387812c8f06b4371e76c81154d5e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 663b0c54a70421da648756bd07eb421db0bdf1cca094e61e4e08b9b07b57c0ba65cf22fd63e81764160b16aa5c22ecbe1b5768983ed19802e7ba8ec68496943e
|
7
|
+
data.tar.gz: aec00d04e584d9d925b405cdf470587a3df815cc6de092458177ec7de80995c55a620f7f883275eb83cd723f83907d8e48b711e802151c215d4e0cabf96fd4e4
|
data/.gitignore
CHANGED
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.
|
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
|
-
###
|
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::
|
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
|
-
|
7
|
+
dur, velocity = Fiber.yield (0..(num-1)).to_a.map{|item|
|
8
8
|
note = notes.sample
|
9
|
-
|
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.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
5
|
+
module Track
|
4
6
|
def to_bin()
|
5
7
|
track = []
|
6
|
-
@
|
7
|
-
|
8
|
-
track.concat
|
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
|
data/lib/kuromusic/IO/MIDI.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require_relative "MIDI/
|
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(
|
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*')
|
data/lib/kuromusic/MIDI.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
@@ -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,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
|
data/lib/kuromusic/Track.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
require_relative "Object"
|
2
|
+
require_relative "Track/Measure"
|
2
3
|
|
3
4
|
class Track < Object
|
4
|
-
def initialize(
|
5
|
-
@
|
5
|
+
def initialize(measures = [])
|
6
|
+
@measures = measures
|
6
7
|
end
|
7
8
|
|
8
9
|
def [](index)
|
9
|
-
@
|
10
|
+
@measures[index]
|
10
11
|
end
|
11
12
|
|
12
13
|
def []=(index, obj)
|
13
|
-
if obj.class.to_s == "
|
14
|
-
@
|
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 != "
|
23
|
+
if e.class.to_s != "Measure"
|
23
24
|
self.error_puts("ArgumentTypeError", "undefined method `+'")
|
24
25
|
end
|
25
26
|
}
|
26
|
-
@
|
27
|
+
@measures.insert(index, *objs)
|
27
28
|
end
|
28
29
|
|
29
30
|
def push(obj)
|
30
|
-
if obj.class.to_s == "
|
31
|
-
@
|
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 == "
|
40
|
-
@
|
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
|
-
@
|
49
|
+
@measures.each {|e|
|
49
50
|
yield(e)
|
50
51
|
}
|
51
52
|
end
|
52
53
|
|
53
54
|
def each_with_index()
|
54
|
-
@
|
55
|
+
@measures.each {|e|
|
55
56
|
yield(e)
|
56
57
|
}
|
57
58
|
end
|
58
59
|
|
59
60
|
def map()
|
60
|
-
result = @
|
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
|
-
@
|
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(@
|
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
|
data/lib/kuromusic/version.rb
CHANGED
data/lib/kuromusic.rb
CHANGED
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
|
5
|
+
melo = MelodyGenerater.new(DELTA_TIME, Scale::MAJOR).extend(MelodyGenerater::Schenker)
|
6
6
|
|
7
|
-
a_can = melo.cantus(5)
|
8
|
-
|
9
|
-
|
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)
|
12
|
-
|
13
|
-
|
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
|
data/lib/sample/main2.rb
ADDED
@@ -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.
|
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-
|
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/
|
64
|
-
- lib/kuromusic/IO/MIDI/
|
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
|