Last active
December 11, 2015 18:39
-
-
Save youpy/4643448 to your computer and use it in GitHub Desktop.
midix for micron
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'coremidi' | |
class MIDIX | |
def initialize | |
@destinations = CoreMIDI::Destination.all | |
end | |
def program_change(program_number, channel = 0) | |
puts(0b11000000 | channel, program_number) | |
end | |
def control_change(control_number, value, channel = 0) | |
puts(0b10110000 | channel, control_number, value) | |
end | |
def puts(*args) | |
@destinations.each do |dst| | |
dst.puts(*args) | |
end | |
end | |
def play(note, duration = 1) | |
Thread.new do | |
oct = rand(6) | |
puts(0x90, note + oct, 100) # note on | |
sleep(duration) | |
puts(0x80, note + oct, 100) # note off | |
end | |
end | |
end | |
class RangeValue | |
def initialize(max) | |
@max = max | |
end | |
def get(value) | |
[value / 128, value % 128] | |
end | |
def get_random | |
get(rand(@max)) | |
end | |
end | |
class CRangeValue < RangeValue | |
def get(value) | |
if value >= 0 | |
[value / 128, value % 128] | |
else | |
[127 - (value.abs / 128), 128 - (value.abs % 128)] | |
end | |
end | |
def get_random | |
get(rand(@max * 2) - @max) | |
end | |
end | |
def range(value) | |
RangeValue.new(value) | |
end | |
def crange(value) | |
CRangeValue.new(value) | |
end | |
class Micron < MIDIX | |
CTRL0 = { | |
# voice | |
0 => range(1), | |
1 => range(3), | |
2 => range(100), | |
3 => range(2), | |
4 => range(3), | |
5 => range(128), | |
6 => range(1), | |
7 => range(100), | |
8 => range(4), | |
9 => range(1000), | |
10 => range(10), | |
# osc 1 | |
11 => range(2), | |
12 => crange(100), | |
13 => crange(3), | |
14 => crange(7), | |
15 => crange(999), | |
16 => range(12), | |
29 => range(100), | |
35 => crange(50), | |
# osc 2 | |
17 => range(2), | |
18 => crange(100), | |
19 => crange(3), | |
20 => crange(7), | |
21 => crange(999), | |
22 => range(12), | |
30 => range(100), | |
36 => crange(50), | |
# osc 3 | |
23 => range(2), | |
24 => crange(100), | |
25 => crange(3), | |
26 => crange(7), | |
27 => crange(999), | |
28 => range(12), | |
31 => range(100), | |
37 => crange(50), | |
# ring mod | |
32 => range(100), | |
38 => crange(50), | |
# ext in | |
34 => range(100), | |
40 => crange(50), | |
# noise | |
33 => range(100), | |
39 => crange(50), | |
42 => range(1), | |
# series | |
41 => range(100), | |
# lfo 1 | |
105 => range(1), | |
106 => range(1000), | |
107 => range(6), | |
108 => range(100), | |
# lfo 2 | |
109 => range(1), | |
110 => range(1000), | |
111 => range(6), | |
112 => range(100), | |
# s/h | |
113 => range(1), | |
114 => range(1000), | |
115 => range(6), | |
116 => range(35), | |
117 => range(100), | |
# filter 1 | |
43 => range(20), | |
44 => range(1023), | |
45 => range(100), | |
46 => crange(100), | |
47 => crange(100), | |
54 => range(100), | |
57 => crange(100), | |
61 => range(1), | |
# filter link | |
48 => range(1), | |
# filter 2 | |
49 => range(20), | |
50 => range(1023), | |
51 => range(100), | |
52 => crange(100), | |
53 => crange(100), | |
55 => range(100), | |
58 => crange(100), | |
# drive | |
62 => range(6), | |
63 => range(100), | |
# pre filter | |
56 => range(100), | |
59 => crange(100), | |
60 => range(6), | |
# fx mix | |
65 => crange(50), | |
# pgm | |
64 => range(100), | |
# env 1 | |
66 => range(256), | |
67 => range(3), | |
68 => range(256), | |
69 => range(3), | |
70 => range(256), | |
71 => range(100), | |
72 => range(256), | |
73 => range(3), | |
74 => range(100), | |
75 => range(1), | |
76 => range(1), | |
77 => range(3), | |
78 => range(1), | |
# env 2 | |
79 => range(256), | |
80 => range(3), | |
81 => range(256), | |
82 => range(3), | |
83 => range(256), | |
84 => range(100), | |
85 => range(256), | |
86 => range(3), | |
87 => range(100), | |
88 => range(1), | |
89 => range(1), | |
90 => range(3), | |
91 => range(1), | |
# env 3 | |
92 => range(256), | |
93 => range(3), | |
94 => range(256), | |
95 => range(3), | |
96 => range(256), | |
97 => range(100), | |
98 => range(256), | |
99 => range(3), | |
100 => range(100), | |
101 => range(1), | |
102 => range(1), | |
103 => range(3), | |
104 => range(1) | |
} | |
CTRL1 = { | |
# lfo 1 | |
31 => range(24), | |
# lfo 2 | |
32 => range(24), | |
# s/h | |
33 => range(24), | |
# fx 1 | |
103 => range(6), | |
104 => range(100), | |
105 => range(100), | |
106 => range(100), | |
107 => range(100), | |
108 => range(100), | |
109 => range(100), | |
110 => range(100), | |
# fx 2 | |
117 => range(6), | |
118 => range(340), | |
119 => range(100), | |
120 => range(100), | |
121 => range(100), | |
# fx balance | |
102 => crange(50) | |
} | |
def initialize | |
super | |
@ctrl = [] | |
CTRL0.each do |k, v| | |
@ctrl << [0, k, v] | |
end | |
CTRL1.each do |k, v| | |
@ctrl << [1, k, v] | |
end | |
end | |
# index (0 - 19) | |
def source(index, value = nil) | |
control_change(99, 1) | |
control_change(98, index * 4 + 52) | |
v6, v38 = RangeValue.new(37).get_random | |
control_change(6, v6) | |
control_change(38, v38) | |
end | |
# index (0 - 19) | |
def dest(index, value = nil) | |
control_change(99, 1) | |
control_change(98, (index * 4 + 1) + 52) | |
v6, v38 = RangeValue.new(77).get_random | |
control_change(6, v6) | |
control_change(38, v38) | |
end | |
# index (0 - 19) | |
def level(index, value = nil) | |
control_change(99, 1) | |
control_change(98, (index * 4 + 2) + 52) | |
v6, v38 = CRangeValue.new(1000).get_random | |
control_change(6, v6) | |
control_change(38, v38) | |
end | |
# index (0 - 19) | |
def offset(index, value = nil) | |
control_change(99, 1) | |
control_change(98, (index * 4 + 3) + 52) | |
v6, v38 = CRangeValue.new(1000).get_random | |
control_change(6, v6) | |
control_change(38, v38) | |
end | |
def xxx | |
v99, v98, v = @ctrl.sample | |
v6, v38 = v.get_random | |
control_change(99, v99) | |
control_change(98, v98) | |
control_change(6, v6) | |
control_change(38, v38) | |
end | |
end | |
midix = Micron.new | |
while true | |
index = rand(20) | |
midix.send([:source, :dest, :level, :offset].sample, index) | |
#midix.source(index) | |
#midix.dest(index) | |
#midix.level(index) | |
#midix.offset(index) | |
#midix.xxx | |
sleep 0.1 | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment