Skip to content

Instantly share code, notes, and snippets.

@youpy
Last active December 11, 2015 18:39
Show Gist options
  • Save youpy/4643448 to your computer and use it in GitHub Desktop.
Save youpy/4643448 to your computer and use it in GitHub Desktop.
midix for micron
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