-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate-sample-midi-stream.rb
102 lines (85 loc) · 2.12 KB
/
generate-sample-midi-stream.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
require_relative 'DigitalSynthVRA8U/constants'
$file = File.open("sample-midi-stream.bin", "wb")
def control_change(control_number, value)
$file.write([(CONTROL_CHANGE | MIDI_CH), control_number, value].pack("C*"))
wait(10)
end
def program_change(program_number)
$file.write([(PROGRAM_CHANGE | MIDI_CH), program_number].pack("C*"))
wait(800)
end
def note_on(note_number, velocity)
$file.write([(NOTE_ON | MIDI_CH), note_number, velocity].pack("C*"))
end
def note_off(note_number)
$file.write([(NOTE_OFF | MIDI_CH), note_number, 64].pack("C*"))
end
def wait(length)
length.times { $file.write([ACTIVE_SENSING].pack("C")) }
end
def play_mono_a(oct)
play_mono(12, oct, 100)
play_mono(16, oct, 100)
play_mono(14, oct, 100)
play_mono(17, oct, 100)
end
def play_a(oct)
play_chord_a(12, 16, 19, 23, oct, 100)
play_chord_a(16, 19, 23, 26, oct, 100)
play_chord_a(14, 17, 21, 24, oct, 100)
play_chord_a(17, 21, 24, 28, oct, 100)
end
def play_b(oct)
play_chord_b(12, 16, 19, 23, oct, 100)
play_chord_b(16, 19, 23, 26, oct, 100)
play_chord_b(14, 17, 21, 24, oct, 100)
play_chord_b(17, 21, 24, 28, oct, 100)
end
def play_mono(x, oct, velocity)
note_on(x + (oct * 12), velocity)
wait(3200)
note_off(x + (oct * 12))
wait(800)
end
def play_chord_a(x, y, z, w, oct, velocity)
note_on(x + (oct * 12), velocity)
note_on(y + (oct * 12), velocity)
note_on(z + (oct * 12), velocity)
note_on(w + (oct * 12), velocity)
wait(3200)
note_off(x + (oct * 12))
note_off(y + (oct * 12))
note_off(z + (oct * 12))
note_off(w + (oct * 12))
wait(800)
end
def play_chord_b(x, y, z, w, oct, velocity)
note_on(x + (oct * 12), velocity)
wait(800)
note_on(y + (oct * 12), velocity)
wait(800)
note_on(z + (oct * 12), velocity)
wait(800)
note_on(w + (oct * 12), velocity)
wait(3200)
note_off(w + (oct * 12))
wait(800)
note_off(z + (oct * 12))
wait(800)
note_off(y + (oct * 12))
wait(800)
note_off(x + (oct * 12))
wait(800)
end
def sound_off
control_change(ALL_SOUND_OFF, 0 )
wait(800)
end
sound_off
program_change(0)
play_mono_a(3)
sound_off
program_change(2)
play_b(3)
sound_off
$file.close