-
Notifications
You must be signed in to change notification settings - Fork 0
/
gac.coffee
149 lines (135 loc) · 4.34 KB
/
gac.coffee
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
console = window.console
RAILS =
initialized: false
clean: (callback) ->
console.log 'Operating cleaning...'
if RAILS.initialized or false
Gibberish.clear()
callback()
init: (callback) ->
console.log 'window.INITializing Gibberails audio-client...'
try
Gibberish.window.INIT()
Gibberish.Time.export()
Gibberish.Binops.export()
RAILS.initialized = true
if callback then callback()
catch e
alert e
execute: (compile, data, callback) ->
try
js = unescape(data)
js = compile js, bare:true, map:{}
js = unescape js
if callback then callback !js, js
catch e
RAILS.initialized = false
alert "#{compile.prototype.name}:\n#{js.map}#{e}"
run: (callback)->
console.log 'Operating compilation...'
RAILS.execute CoffeeScript.compile, RAILS.editor.getValue(), (err, js) ->
if callback then callback err, eval js else eval js
checkfloats: (k, v)->
b = false
for t in ['freq', 'amp', 'pulsewidth', 'chance', 'pitchMin', 'pitchMax', 'pitchChance', 'cutoff', 'Q', 'roomSize', 'dry', 'wet']
if (typeof(v) is 'object') and k == t
b = true
break
b
checkints: (k, v)->
b = false
for t in ['mode', 'rate', 'amount']
if (typeof(v) is 'object') and k == t
b = true
break
b
# As funções abaixo são apenas para serem utilizadas
# dentro do ambiente dado pela função `eval()` durante
# o processo do JIT
# Após inicializar, limpe, re-inicie o servidor de audio e execute a função
# dada pelo usuario depois de um tempo determinado
window.INIT = (time, callback) ->
setTimeout -> RAILS.clean -> RAILS.init ->
console.log "! RUnNINg !"
RAILS.initialized = true
callback()
, time
# Um gerador de audio
# ```coffee
# sinG = new Gibberish.Sine(445, 0.71)
# sin = window.GEN "Sine", amp:440, freq: 0.71 # similar ao anterior
# sinG.connect()
# sin.connect()
# ```
# _return_ *Gibberish.Ugen*
window.GEN = (n, o, c) ->
try
u = new Gibberish[n]
console.log "#{u} #{n}:"
(console.log " #{k}:#{v}" ; u[k] = v) for k, v of o
if c then c u else u
catch e
alert e
# Um gerador de audio, mas com valores randomicos; é interessante notar que
# se você quiser um número randômico, forneça um Array de dois valores; se você
# não quiser, deixe como quiser
# ```coffee
# sinG = new Gibberish.Sine(Gibberish.rndf(440, 445), 0.71)
# sin = GEN_RANDOM "Sine", amp: 0.71, freq: [440, 445] # similar ao anterior
# sinG.connect()
# sin.connect()
# ```
# _return_ *Gibberish.Ugen*
window.GEN_RAND = (n, o, c) ->
for k, v of o
if RAILS.checkfloats(k, v)
o[k] = Gibberish.rndf v[0], v[v.length-1]
else if RAILS.checkints(k, v)
o[k] = Gibberish.rndi v[0], v[v.length-1]
else
o[k] = v
window.GEN n, o, c
# Um gerador de audio, mas com valores dados por uma função; é interessante notar que
# se você quiser um número algoritico, forneça uma função geradora que retorne um
# objeto (Hash) com as propriedades necessárias para a Unidade geradora de audio; se você
# não quiser, deixe como quiser
# ```coffee
# freq = Gibberish.rndf(440, 445)
# amp = 1/o.freq
# sinG = new Gibberish.Sine(freq, amp)
# sin = GEN_FN "Sine", freq: -> Gibberish.rndf(440, 445), amp: (freq)-> 1/freq
# sinG.connect()
# sin.connect()
# ```
# _return_ *Gibberish.Ugen*
window.GEN_FN = (n, o, c) ->
for k, v of o
if (typeof(v) is 'Function')
o[k] = v()
window.GEN n, o, c
# Um simples sequenciador, onde se passa funções geradoras de arrays;
# Aqui se nota um processo de composição algoritimica, onde passsa-se qualquer
# função geradora de uma série de valores numericos
# ```coffee
# GEN_SEQ
# target: karplus
# durations: ->
# min = Gibberish.rndi(30, 500)
# max = Gibberish.rndi(970, 1100)
# [ms(min)..ms(max)]
# keysAndValues:
# note: ->
# a = []
# a[i] = Math.pow(2, i+8) for i in [0..7]
# a[Gibberish.rndi(0, a.length-1)] for i in [0..21]
# amp: ->
# a = []
# a[i] = Math.pow(2, i+8) for i in [0..7]
# a[Gibberish.rndi(0, a.length-1)]/16384 for i in [0..13]
# ```
# _return_ *Gibberish.Sequencer*
window.GEN_SEQ = (o, c) ->
o.keysAndValues[k] = v() for k, v of o.keysAndValues
o.durations = o.durations()
u = new Gibberish.Sequencer(o)
if c then c u else u