kuromusic 0.0.2 → 0.0.3
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 +75 -26
- data/lib/kuromusic/Generator/Random.rb +2 -7
- data/lib/kuromusic/Generator/Schenker.rb +4 -11
- data/lib/kuromusic/IO/MIDI/Chord.rb +3 -3
- data/lib/kuromusic/IO/MIDI/Measure.rb +2 -2
- data/lib/kuromusic/IO/MIDI/Track.rb +1 -1
- data/lib/kuromusic/Key.rb +62 -2
- data/lib/kuromusic/MelodyGenerater.rb +2 -3
- data/lib/kuromusic/Scale.rb +8 -18
- data/lib/kuromusic/Track.rb +13 -3
- data/lib/kuromusic/Track/Measure.rb +4 -4
- data/lib/kuromusic/Track/Measure/Chord.rb +2 -2
- data/lib/kuromusic/Track/Measure/Chord/Note.rb +27 -8
- data/lib/kuromusic/version.rb +1 -1
- data/lib/sample/main.rb +14 -11
- data/lib/sample/main2.rb +8 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8db1094e3fb4f19902a4bb5c15aba0c6639eecc7
|
4
|
+
data.tar.gz: cbc36b3a67c2665aaf004567df380be12632dff5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8454abcb46e6d7900b839e9754efaec96d567b9d4a2b6625f8ffc2a14d5388c97a9761ff5771eab52674fc44c32652ae2718c0fb9e0a2b0a30d90ca6bd60ef84
|
7
|
+
data.tar.gz: ad702556dd8746de404afece9e66d87f33395e0d6dbda8964fd8d1533bd104ced6a75a65000a5a70152b76376b4a83107eb6d99026c6447034fec2cd469a34d6
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# KuroMusic
|
2
2
|
|
3
|
-
KuroMusic is midi controll library
|
3
|
+
KuroMusic is midi controll library written by ruby.
|
4
4
|
|
5
5
|
##version
|
6
|
-
0.0.
|
6
|
+
0.0.3
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -28,22 +28,30 @@ you should require KuroMusic in your source code to use those method.
|
|
28
28
|
require "KuroMusic"
|
29
29
|
```
|
30
30
|
|
31
|
-
###
|
31
|
+
###define DELTA TIME
|
32
|
+
|
33
|
+
you should define delta time.
|
34
|
+
delta time is imaginary time as quarter note used in MIDI.
|
32
35
|
```ruby:
|
33
36
|
DELTA_TIME = 480
|
37
|
+
```
|
38
|
+
|
39
|
+
###generating melody on yourself
|
40
|
+
```ruby:
|
34
41
|
midi = Midi.new(DELTA_TIME, 1)
|
35
42
|
chords1 = [
|
36
|
-
Chord.new([Note.new(
|
37
|
-
Chord.new([Note.new(
|
38
|
-
Chord.new([Note.new(
|
39
|
-
Chord.new([Note.new(
|
43
|
+
Chord.new([Note.new(-3, 4, 100, 480),Note.new(0, 4, 100, 480),Note.new(4, 4, 100, 480)]),
|
44
|
+
Chord.new([Note.new(-1, 4, 100, 480),Note.new(2, 4, 100, 480),Note.new(5, 4, 100, 480)]),
|
45
|
+
Chord.new([Note.new(0, 4, 100, 480),Note.new(4, 4, 100, 480),Note.new(7, 4, 100, 480)]),
|
46
|
+
Chord.new([Note.new(2, 4, 100, 480),Note.new(5, 4, 100, 480),Note.new(9, 4, 100, 480)]),
|
40
47
|
]
|
41
48
|
chords2 = [
|
42
|
-
Chord.new([Note.new(
|
43
|
-
Chord.new([Note.new(
|
44
|
-
Chord.new([Note.new(
|
49
|
+
Chord.new([Note.new(4, 4, 100, 480),Note.new(7, 4, 100, 480),Note.new(11, 4, 100, 480)]),
|
50
|
+
Chord.new([Note.new(5, 4, 100, 480),Note.new(9, 4, 100, 480),Note.new(0, 5, 100, 480)]),
|
51
|
+
Chord.new([Note.new(7, 4, 100, 480),Note.new(11, 4, 100, 480),Note.new(2, 5, 100, 480)]),
|
45
52
|
]
|
46
53
|
midi.tracks[0] = Track.new(
|
54
|
+
Key::C::NATURAL,
|
47
55
|
[
|
48
56
|
Measure.new(chords1),
|
49
57
|
Measure.new(chords2)
|
@@ -55,36 +63,77 @@ midi.tracks[0] = Track.new(
|
|
55
63
|
```ruby:
|
56
64
|
DELTA_TIME = 480
|
57
65
|
midi = Midi.new(DELTA_TIME, 2)
|
58
|
-
melo = MelodyGenerater.new(DELTA_TIME, Scale::MAJOR).extend(MelodyGenerater::Schenker)
|
59
|
-
midi.tracks[0] = melo.
|
60
|
-
midi.tracks[1] = melo.
|
66
|
+
melo = MelodyGenerater.new(DELTA_TIME, Key::E::NATURAL, Scale::MAJOR).extend(MelodyGenerater::Schenker)
|
67
|
+
midi.tracks[0] = melo.generate(10, 4)
|
68
|
+
midi.tracks[1] = melo.generate(10, 2)
|
61
69
|
```
|
62
70
|
|
63
71
|
###changing tempo
|
64
72
|
```ruby:
|
65
|
-
|
66
|
-
|
73
|
+
can_track = melo.generate(10, 4)
|
74
|
+
can_track[0].set_meta(Event::Meta::set_tempo(171))
|
67
75
|
```
|
68
76
|
|
69
77
|
###connecting tracks
|
70
78
|
```ruby:
|
71
|
-
|
72
|
-
|
73
|
-
midi.tracks[0] =
|
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
|
79
|
+
a_can_track = melo.generate(10, 4)
|
80
|
+
b_can_track = melo.generate(10, 4)
|
81
|
+
midi.tracks[0] = a_can_track + b_can_track
|
81
82
|
```
|
82
83
|
|
83
84
|
###write midi file
|
84
85
|
```ruby:
|
85
|
-
Midi::IO.write("
|
86
|
+
Midi::IO.write("hoge.mid", midi)
|
86
87
|
```
|
87
88
|
|
89
|
+
##reference
|
90
|
+
###Note
|
91
|
+
Note.new(degree, octave, velocity, duration)
|
92
|
+
|
93
|
+
duration is based on delta time.
|
94
|
+
|
95
|
+
###Chord
|
96
|
+
Chord.new([Notes])
|
97
|
+
|
98
|
+
###Measure
|
99
|
+
Measure.new([Chords])
|
100
|
+
|
101
|
+
###Track
|
102
|
+
Track.new(key, [Measures])
|
103
|
+
|
104
|
+
###Key
|
105
|
+
- Key::C::NATURAL
|
106
|
+
- Key::B::SHARP
|
107
|
+
- Key::C::SHARP
|
108
|
+
- Key::D::FLAT
|
109
|
+
- Key::D::NATURAL
|
110
|
+
- Key::D::SHARP
|
111
|
+
- Key::E::FLAT
|
112
|
+
- Key::E::NATURAL
|
113
|
+
- Key::F::FLAT
|
114
|
+
- Key::E::SHARP
|
115
|
+
- Key::F::NATURAL
|
116
|
+
- Key::C::FLAT
|
117
|
+
- Key::B::NATURAL
|
118
|
+
- Key::A::SHARP
|
119
|
+
- Key::B::FLAT
|
120
|
+
- Key::A::NATURAL
|
121
|
+
- Key::A::FLAT
|
122
|
+
- Key::G::SHARP
|
123
|
+
- Key::G::NATURAL
|
124
|
+
- Key::G::FLAT
|
125
|
+
- Key::F::SHARP
|
126
|
+
|
127
|
+
###Scale
|
128
|
+
- Scale::MAJOR
|
129
|
+
- Scale::MINOR
|
130
|
+
- Scale::PENTATONIC
|
131
|
+
- Scale::WHOLE_TONE
|
132
|
+
- Scale::OKINAWA
|
133
|
+
- Scale::INDIAN
|
134
|
+
- Scale::GYPSY
|
135
|
+
- Scale::KUMOI
|
136
|
+
|
88
137
|
## Contributing
|
89
138
|
|
90
139
|
1. Fork it ( https://github.com/[my-github-username]/kuromusic/fork )
|
@@ -33,13 +33,8 @@ class MelodyGenerater
|
|
33
33
|
end
|
34
34
|
|
35
35
|
public
|
36
|
-
def
|
37
|
-
octave
|
38
|
-
Track.new(common(length, octave, @note_times[4..5], @scale))
|
39
|
-
end
|
40
|
-
def cantus(length)
|
41
|
-
octave = 4
|
42
|
-
Track.new(common(length, octave, @note_times[1..3], @scale))
|
36
|
+
def generate(length, octave)
|
37
|
+
Track.new(@key, common(length, octave, @note_times[2..3], @scale))
|
43
38
|
end
|
44
39
|
end
|
45
40
|
end
|
@@ -11,9 +11,8 @@ class MelodyGenerater
|
|
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
|
-
|
15
|
-
|
16
|
-
Note.new(note, octave, velocity, dur)
|
14
|
+
degree = _n % 12
|
15
|
+
Note.new(degree, octave, velocity, dur)
|
17
16
|
}
|
18
17
|
}
|
19
18
|
end
|
@@ -42,14 +41,8 @@ class MelodyGenerater
|
|
42
41
|
end
|
43
42
|
|
44
43
|
public
|
45
|
-
def
|
46
|
-
octave
|
47
|
-
Track.new(common(length, octave, @note_times[4..5], BACK))
|
48
|
-
end
|
49
|
-
|
50
|
-
def cantus(length)
|
51
|
-
octave = 4
|
52
|
-
Track.new(common(length, octave, @note_times[2..3], MIDDLE))
|
44
|
+
def generate(length, octave)
|
45
|
+
Track.new(@key, common(length, octave, @note_times[2..3], @scale))
|
53
46
|
end
|
54
47
|
end
|
55
48
|
end
|
@@ -4,7 +4,7 @@ class Midi
|
|
4
4
|
private
|
5
5
|
module Chord
|
6
6
|
public
|
7
|
-
def to_bin()
|
7
|
+
def to_bin(key)
|
8
8
|
predur = 0
|
9
9
|
ons = []
|
10
10
|
offs = []
|
@@ -12,11 +12,11 @@ class Midi
|
|
12
12
|
@notes.sort {|a, b|
|
13
13
|
a.dur <=> b.dur
|
14
14
|
}.each {|n|
|
15
|
-
ons += [::Event::Note::rest(0), n.get_on_event]
|
15
|
+
ons += [::Event::Note::rest(0), n.get_on_event(key)]
|
16
16
|
maxdur = n.dur if maxdur < n.dur
|
17
17
|
}.each {|n|
|
18
18
|
currentdur = n.dur - predur
|
19
|
-
offs += [::Event::Note::rest(currentdur), n.get_off_event]
|
19
|
+
offs += [::Event::Note::rest(currentdur), n.get_off_event(key)]
|
20
20
|
predur = n.dur
|
21
21
|
}
|
22
22
|
(ons + offs).map {|e|
|
@@ -4,13 +4,13 @@ require_relative "Event"
|
|
4
4
|
class Midi
|
5
5
|
private
|
6
6
|
module Measure
|
7
|
-
def to_bin()
|
7
|
+
def to_bin(key)
|
8
8
|
@metas.map {|m|
|
9
9
|
m.extend(Midi::Event)
|
10
10
|
m.to_bin
|
11
11
|
}.flatten.concat @chords.map {|c|
|
12
12
|
c.extend(Midi::Chord)
|
13
|
-
c.to_bin
|
13
|
+
c.to_bin(key)
|
14
14
|
}.flatten!
|
15
15
|
end
|
16
16
|
end
|
@@ -7,7 +7,7 @@ class Midi
|
|
7
7
|
track = []
|
8
8
|
@measures.each {|m|
|
9
9
|
m.extend(Midi::Measure)
|
10
|
-
track.concat m.to_bin
|
10
|
+
track.concat m.to_bin(@key)
|
11
11
|
}
|
12
12
|
tl = track.concat([0, 0xff, 0x02, 0]).size
|
13
13
|
result = [0x4d, 0x54, 0x72, 0x6b, tl >> 24, tl >> 16, tl >> 8, tl % 256].concat track
|
data/lib/kuromusic/Key.rb
CHANGED
@@ -1,3 +1,63 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Key extend self
|
2
|
+
module C extend self
|
3
|
+
NATURAL = "C"
|
4
|
+
SHARP = "C#"
|
5
|
+
FLAT = "Cb"
|
6
|
+
end
|
7
|
+
module D extend self
|
8
|
+
NATURAL = "D"
|
9
|
+
SHARP = "D#"
|
10
|
+
FLAT = "Db"
|
11
|
+
end
|
12
|
+
module E extend self
|
13
|
+
NATURAL = "E"
|
14
|
+
SHARP = "E#"
|
15
|
+
FLAT = "Eb"
|
16
|
+
end
|
17
|
+
module F extend self
|
18
|
+
NATURAL = "F"
|
19
|
+
SHARP = "F#"
|
20
|
+
FLAT = "Fb"
|
21
|
+
end
|
22
|
+
module G extend self
|
23
|
+
NATURAL = "G"
|
24
|
+
SHARP = "G#"
|
25
|
+
FLAT = "Gb"
|
26
|
+
end
|
27
|
+
module A extend self
|
28
|
+
NATURAL = "A"
|
29
|
+
SHARP = "A#"
|
30
|
+
FLAT = "Ab"
|
31
|
+
end
|
32
|
+
module B extend self
|
33
|
+
NATURAL = "B"
|
34
|
+
SHARP = "B#"
|
35
|
+
FLAT = "Bb"
|
36
|
+
end
|
37
|
+
|
38
|
+
def key_to_degree(key)
|
39
|
+
{
|
40
|
+
#positive
|
41
|
+
Key::C::NATURAL => 0, Key::B::SHARP => 0,
|
42
|
+
Key::C::SHARP => 1, Key::D::FLAT => 1,
|
43
|
+
Key::D::NATURAL => 2,
|
44
|
+
Key::D::SHARP => 3, Key::E::FLAT => 3,
|
45
|
+
Key::E::NATURAL => 4, Key::F::FLAT => 4,
|
46
|
+
Key::E::SHARP => 5, Key::F::NATURAL => 5,
|
47
|
+
|
48
|
+
#negative
|
49
|
+
Key::C::FLAT => -1, Key::B::NATURAL => -1,
|
50
|
+
Key::A::SHARP => -2, Key::B::FLAT => -2,
|
51
|
+
Key::A::NATURAL => -3,
|
52
|
+
Key::A::FLAT => -4, Key::G::SHARP => -4,
|
53
|
+
Key::G::NATURAL => -5,
|
54
|
+
Key::G::FLAT => -6, Key::F::SHARP => -6
|
55
|
+
}[key]
|
56
|
+
end
|
57
|
+
|
58
|
+
def degree_to_key(number)
|
59
|
+
{
|
60
|
+
0=>"C", 1=>"C#", 2=>"D", 3=>"D#", 4=>"E", 5=>"F", 6=>"F#", 7=>"G", 8=>"G#", 9=>"A", 10=>"A#", 11=>"B"
|
61
|
+
}[number % 12]
|
62
|
+
end
|
3
63
|
end
|
@@ -4,12 +4,11 @@ require_relative "Generator/Random"
|
|
4
4
|
require_relative "Generator/Schenker"
|
5
5
|
|
6
6
|
class MelodyGenerater
|
7
|
-
def initialize(dtime,
|
8
|
-
@chord = chord
|
7
|
+
def initialize(dtime, key, scale)
|
9
8
|
@dtime = dtime
|
10
9
|
@note_times = [dtime/8, dtime/4, dtime/2, dtime, dtime*2, dtime*4]
|
11
|
-
@scale = scale
|
12
10
|
@key = key
|
11
|
+
@scale = scale
|
13
12
|
@measure = dtime * 4
|
14
13
|
end
|
15
14
|
end
|
data/lib/kuromusic/Scale.rb
CHANGED
@@ -1,20 +1,10 @@
|
|
1
1
|
module Scale extend self
|
2
|
-
MAJOR = [
|
3
|
-
MINOR = [
|
4
|
-
PENTATONIC = [
|
5
|
-
WHOLE_TONE = [
|
6
|
-
OKINAWA = [
|
7
|
-
INDIAN = [
|
8
|
-
GYPSY = [
|
9
|
-
KUMOI = [
|
10
|
-
|
11
|
-
def note_to_n(note)
|
12
|
-
map = {"C"=>0, "C#"=>1, "D"=>2, "D#"=>3, "E"=>4, "F"=>5, "F#"=>6, "G"=>7, "G#"=>8, "A"=>9, "A#"=>10, "B"=>11}
|
13
|
-
map[note]
|
14
|
-
end
|
15
|
-
|
16
|
-
def number_to_code(number)
|
17
|
-
map = {0=>"C", 1=>"C#", 2=>"D", 3=>"D#", 4=>"E", 5=>"F", 6=>"F#", 7=>"G", 8=>"G#", 9=>"A", 10=>"A#", 11=>"B"}
|
18
|
-
map[number]
|
19
|
-
end
|
2
|
+
MAJOR = [0, 2, 4, 5, 7, 9, 11]
|
3
|
+
MINOR = [0, 2, 3, 5, 7, 8, 11]
|
4
|
+
PENTATONIC = [0, 2, 4, 7, 9]
|
5
|
+
WHOLE_TONE = [0, 2, 4, 6, 8, 10]
|
6
|
+
OKINAWA = [0, 4, 5, 7, 11]
|
7
|
+
INDIAN = [0, 1, 4, 6, 7, 9, 11]
|
8
|
+
GYPSY = [0, 1, 4, 5, 7, 8, 11]
|
9
|
+
KUMOI = [0, 2, 3, 7, 9]
|
20
10
|
end
|
data/lib/kuromusic/Track.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require_relative "Object"
|
2
|
+
require_relative "Key"
|
2
3
|
require_relative "Track/Measure"
|
3
4
|
|
4
5
|
class Track < Object
|
5
|
-
def initialize(measures = [])
|
6
|
+
def initialize(key, measures = [])
|
7
|
+
@key = key
|
6
8
|
@measures = measures
|
7
9
|
end
|
8
10
|
|
@@ -70,6 +72,10 @@ class Track < Object
|
|
70
72
|
}
|
71
73
|
end
|
72
74
|
|
75
|
+
def length()
|
76
|
+
@measure.length
|
77
|
+
end
|
78
|
+
|
73
79
|
def +(other)
|
74
80
|
tmp = []
|
75
81
|
if other.class.to_s == "Track"
|
@@ -81,12 +87,16 @@ class Track < Object
|
|
81
87
|
else
|
82
88
|
self.error_puts("ArgumentTypeError", "undefined method `+'")
|
83
89
|
end
|
84
|
-
Track.new(tmp)
|
90
|
+
Track.new(@key, tmp)
|
85
91
|
end
|
86
92
|
|
87
93
|
def inspect()
|
88
94
|
"[
|
89
|
-
|
95
|
+
Track Meta: < key = #{@key} >
|
96
|
+
----------------------------------------------------------
|
97
|
+
" + @measures.each_with_index.map{|m, i|
|
98
|
+
"Measure #{i+1}:\n" + m.inspect(@key)
|
99
|
+
}.join("\n ----------------------------------------------------------\n ") + "
|
90
100
|
]"
|
91
101
|
end
|
92
102
|
end
|
@@ -16,11 +16,11 @@ class Measure < Object
|
|
16
16
|
self
|
17
17
|
end
|
18
18
|
|
19
|
-
def inspect()
|
20
|
-
|
21
|
-
|
19
|
+
def inspect(key = nil)
|
20
|
+
" Measure Meta:
|
21
|
+
" + @metas.map{|m| " " + m.inspect + "\n"}.join() + "
|
22
22
|
(
|
23
|
-
" + @chords.map{|m| m.inspect}.join("\n ),\n (\n ") + "
|
23
|
+
" + @chords.map{|m| m.inspect(key)}.join("\n ),\n (\n ") + "
|
24
24
|
)"
|
25
25
|
end
|
26
26
|
end
|
@@ -2,23 +2,42 @@ require_relative "Note/Event"
|
|
2
2
|
|
3
3
|
class Note < Object
|
4
4
|
attr_reader :note, :octave, :velocity, :dur
|
5
|
+
private
|
6
|
+
def get_gdeg_and_goct(key)
|
7
|
+
key_n = Key::key_to_degree(key)
|
8
|
+
gdeg = (key_n + @degree) % 12
|
9
|
+
if gdeg < 0
|
10
|
+
goct = @octave - 1
|
11
|
+
else
|
12
|
+
goct = @octave + (key_n + @degree) / 12
|
13
|
+
end
|
14
|
+
return gdeg, goct
|
15
|
+
end
|
16
|
+
|
5
17
|
public
|
6
|
-
def initialize(
|
7
|
-
@
|
18
|
+
def initialize(degree, octave, velocity, dur)
|
19
|
+
@degree = degree
|
8
20
|
@octave = octave
|
9
21
|
@dur = dur
|
10
22
|
@velocity = velocity
|
11
23
|
end
|
12
24
|
|
13
|
-
def get_on_event()
|
14
|
-
|
25
|
+
def get_on_event(key)
|
26
|
+
gdeg, goct = get_gdeg_and_goct(key)
|
27
|
+
Event::Note::on(Key::degree_to_key(gdeg), goct, @velocity)
|
15
28
|
end
|
16
29
|
|
17
|
-
def get_off_event()
|
18
|
-
|
30
|
+
def get_off_event(key)
|
31
|
+
gdeg, goct = get_gdeg_and_goct(key)
|
32
|
+
Event::Note::off(Key::degree_to_key(gdeg), goct)
|
19
33
|
end
|
20
34
|
|
21
|
-
def inspect()
|
22
|
-
|
35
|
+
def inspect(key = nil)
|
36
|
+
if key.nil?
|
37
|
+
"<:degree=>" + @degree.to_s + ", :octave=>" + @octave.to_s + ", :velocity:=>" + @velocity.to_s + ", :duration=>" + @dur.to_s + ">"
|
38
|
+
else
|
39
|
+
gdeg, goct = get_gdeg_and_goct(key)
|
40
|
+
"<:note=>" + Key::degree_to_key(gdeg) + ", :octave=>" + goct.to_s + ", :velocity:=>" + @velocity.to_s + ", :duration=>" + @dur.to_s + ">"
|
41
|
+
end
|
23
42
|
end
|
24
43
|
end
|
data/lib/kuromusic/version.rb
CHANGED
data/lib/sample/main.rb
CHANGED
@@ -2,18 +2,21 @@ 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::
|
5
|
+
melo = MelodyGenerater.new(DELTA_TIME, Key::E::NATURAL, Scale::MAJOR).extend(MelodyGenerater::Rand)
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
a_can_track = melo.generate(5, 4)
|
8
|
+
a_can_track[0].set_meta(Event::Meta::set_tempo(171))
|
9
|
+
b_can_track = melo.generate(5, 4)
|
10
|
+
s_can_track = melo.generate(10, 4)
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
a_bas_track = melo.generate(5, 2)
|
13
|
+
a_bas_track[0].set_meta(Event::Meta::set_tempo(171))
|
14
|
+
b_bas_track = melo.generate(5, 2)
|
15
|
+
s_bas_track = melo.generate(10, 2)
|
16
16
|
|
17
|
-
midi.tracks[0] =
|
18
|
-
midi.tracks[1] =
|
17
|
+
midi.tracks[0] = a_can_track + b_can_track + s_can_track + a_can_track + b_can_track + s_can_track + a_can_track
|
18
|
+
midi.tracks[1] = a_bas_track + b_bas_track + s_bas_track + a_bas_track + b_bas_track + s_bas_track + a_bas_track
|
19
|
+
|
20
|
+
p midi.tracks[0]
|
21
|
+
p midi.tracks[1]
|
19
22
|
Midi::IO.write("../../hoge3.mid", midi)
|
data/lib/sample/main2.rb
CHANGED
@@ -3,17 +3,18 @@ require_relative "../KuroMusic"
|
|
3
3
|
DELTA_TIME = 480
|
4
4
|
midi = Midi.new(DELTA_TIME, 1)
|
5
5
|
chords1 = [
|
6
|
-
Chord.new([Note.new(
|
7
|
-
Chord.new([Note.new(
|
8
|
-
Chord.new([Note.new(
|
9
|
-
Chord.new([Note.new(
|
6
|
+
Chord.new([Note.new(-3, 4, 100, 480),Note.new(0, 4, 100, 480),Note.new(4, 4, 100, 480)]),
|
7
|
+
Chord.new([Note.new(-1, 4, 100, 480),Note.new(2, 4, 100, 480),Note.new(5, 4, 100, 480)]),
|
8
|
+
Chord.new([Note.new(0, 4, 100, 480),Note.new(4, 4, 100, 480),Note.new(7, 4, 100, 480)]),
|
9
|
+
Chord.new([Note.new(2, 4, 100, 480),Note.new(5, 4, 100, 480),Note.new(9, 4, 100, 480)]),
|
10
10
|
]
|
11
11
|
chords2 = [
|
12
|
-
Chord.new([Note.new(
|
13
|
-
Chord.new([Note.new(
|
14
|
-
Chord.new([Note.new(
|
12
|
+
Chord.new([Note.new(4, 4, 100, 480),Note.new(7, 4, 100, 480),Note.new(11, 4, 100, 480)]),
|
13
|
+
Chord.new([Note.new(5, 4, 100, 480),Note.new(9, 4, 100, 480),Note.new(0, 5, 100, 480)]),
|
14
|
+
Chord.new([Note.new(7, 4, 100, 480),Note.new(11, 4, 100, 480),Note.new(2, 5, 100, 480)]),
|
15
15
|
]
|
16
16
|
midi.tracks[0] = Track.new(
|
17
|
+
Key::C::NATURAL,
|
17
18
|
[
|
18
19
|
Measure.new(chords1),
|
19
20
|
Measure.new(chords2)
|
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.3
|
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-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|