-
Notifications
You must be signed in to change notification settings - Fork 0
/
maraca.rb
134 lines (129 loc) · 3.77 KB
/
maraca.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# maraca.rb -- maraca.ins -> maraca.scm -> maraca.rb
# Translator: Michael Scholz <mi-scholz@users.sourceforge.net>
# Created: Fri Apr 22 23:29:22 CEST 2005
# Changed: Sat Feb 19 18:27:34 CET 2011
# Commentary:
#
# Perry Cook's maraca from CMJ vol 21 no 3 (Fall 97) p 44 translated
# from CLM's maraca.ins
#
# Code:
def maraca(start, dur,
amp = 0.1,
sound_decay = 0.95,
system_decay = 0.999,
probability = 0.0625,
shell_freq = 3200.0,
shell_reso = 0.96)
temp = 0.0
shake_energy = 0.0
snd_level = 0.0
input = 0.0
output = Vct.new(2)
coeffs = Vct.new(2)
num_beans = 64
j = 0
sndamp = amp / 16384.0
srate4 = (mus_srate / 4.0).floor
gain = ((log(num_beans) / log(4)) * 40.0) / num_beans
coeffs[0] = -2.0 * shell_reso * cos(hz2radians(shell_freq))
coeffs[1] = shell_reso * shell_reso
run_instrument(start, dur) do
if temp < TWO_PI
temp += hz2radians(20)
shake_energy += 1.0 - cos(temp)
end
if j == srate4
temp = 0.0
j = 0
end
j += 1
shake_energy *= system_decay
if random(1.0) < probability
snd_level = snd_level + gain * shake_energy
end
input = snd_level * (random(2.0) - 1.0)
snd_level *= sound_decay
input = input - output[0] * coeffs[0] - output[1] * coeffs[1]
output[1], output[0] = output[0], input
sndamp * (output[0] - output[1])
end
end
# maraca: vct2channel(maraca(0, 5, 0.5))
# cabasa: vct2channel(maraca(0, 5, 0.5, 0.95, 0.997, 0.5, 3000.0, 0.7))
def big_maraca(start, dur,
amp = 0.1,
sound_decay = 0.95,
system_decay = 0.999,
probability = 0.0625,
shell_freqs = [3200.0],
shell_resos = [0.96],
randiff = 0.01,
with_filters = true)
temp = 0.0
temp1 = 0.0
resn = shell_freqs.length
shake_energy = 0.0
snd_level = 0.0
input = 0.0
sum = 0.0
last_sum = 0.0
last_diff = 0.0
diff = 0.0
output = Vct.new(resn * 2)
coeffs = Vct.new(resn * 2)
basesf = Vct.new(resn)
num_beans = 64
j = 0
sndamp = amp / 16384.0
srate4 = (mus_srate / 4.0).floor
gain = ((log(num_beans) / log(4)) * 40.0) / num_beans
resn.times do |i|
basesf[i] = coeffs[i * 2] = -2.0 * shell_resos[i] * cos(hz2radians(shell_freqs[i]))
coeffs[1 + i * 2] = shell_resos[i] * shell_resos[i]
end
run_instrument(start, dur) do
if temp < TWO_PI
temp += hz2radians(20)
shake_energy += 1.0 - cos(temp)
end
if j == srate4
temp = 0.0
j = 0
end
j += 1
shake_energy *= system_decay
if random(1.0) < probability
snd_level = snd_level + gain * shake_energy
basesf.each_with_index do |val, i|
coeffs[i * 2] = val + (random(2.0 * randiff) - randiff)
end
end
input = snd_level * (random(2.0) - 1.0)
snd_level *= sound_decay
temp1 = input
last_sum = sum
sum = 0.0
resn.times do |i|
input = temp1
input = input - output[i * 2] * coeffs[i * 2] - output[i * 2 + 1] * coeffs[i * 2 + 1]
output[i * 2 + 1], output[i * 2] = output[i * 2], input
sum += input
end
if with_filters
last_diff, diff = diff, sum - last_sum
temp1 = last_diff + diff
else
temp1 = sum
end
sndamp * temp1
end
end
# tambourine: big_maraca(0, 1, 0.25, 0.95, 0.9985, 0.03125,
# [2300, 5600, 8100], [0.96, 0.995, 0.995], 0.01)
# sleighbells: big_maraca(0, 2, 0.5, 0.97, 0.9994, 0.03125,
# [2500, 5300, 6500, 8300, 9800], [0.999, 0.999, 0.999, 0.999, 0.999])
# sekere: big_maraca(0, 2, 0.5, 0.96, 0.999, .0625, [5500], [0.6])
# windchimes: big_maraca(0, 2, 0.5, 0.99995, 0.95, 0.001,
# [2200, 2800, 3400], [0.995, 0.995, 0.995], 0.01, false)
# maraca.rb ends here