-odac
/*
EXAMPLE 3
Insert some frequencies and durations to a MySQL database
then query/play random pairs
*/
sr = 44100
kr = 4410
nchnls = 2
0dbfs = 1
seed 0
; connect: type, hostname or IP, database name, username, password
gidb dbconnect "mysql", "localhost", "databasename", "username", "password"
; initialise the example
instr start_example
; create tables if not existing/truncate if existing and fill with frequency and duration data
dbexec gidb, "CREATE TABLE IF NOT EXISTS frequencies (freq FLOAT)"
dbexec gidb, "TRUNCATE TABLE frequencies"
dbexec gidb, "CREATE TABLE IF NOT EXISTS durations (dur FLOAT)"
dbexec gidb, "TRUNCATE TABLE durations"
dbexec gidb, "INSERT INTO frequencies (freq) VALUES (277.2), (349.272), (415.24559), (523.35359), (391.96079)"
dbexec gidb, "INSERT INTO frequencies (freq) SELECT freq*2 FROM frequencies"
dbexec gidb, "INSERT INTO durations (dur) VALUES (0.1), (0.2), (0.4), (0.8), (1), (1.2)"
; run the sequencer instrument for 30 seconds
event_i "i", "sequence", 0, 30
endin
; random sequencer instrument
instr sequence
; query to return random frequency/duration pair
Sql = {{
SELECT f.freq, d.dur
FROM frequencies f
JOIN (SELECT dur FROM durations ORDER BY RAND() LIMIT 1) d
ORDER BY RAND()
LIMIT 1
}}
; array needs to be initialised or schedkwhen complains
kevent[][] init 1, 2
; query twice per second
ktrig metro 3
; query on metro returning the frequency/duration pair
kdone, kevent[][] dbarray_k gidb, Sql, ktrig
; schedule the note
schedkwhen kdone, 0, 0, "osc", 0, kevent[0][1], kevent[0][0]
endin
; play a note
instr osc
; pick a random waveform
ifn = int(random(1, 4))
; set frequency and envelope
ifreq = p4
kamp line 0.5, p3, 0
; play it
a1 oscil kamp, ifreq, ifn
outs a1, a1
endin
f1 0 16384 10 1
f2 0 16384 10 1 0.5 0.3 0.25 0.2 0.167 0.14 0.125 .11
f3 0 16384 10 1 0 0.3 0 0.2 0 0.14 0 .111
f4 0 16384 10 1 1 1 1 0.7 0.5 0.3 0.1
; begin example
i "start_example" 0 1