-- vOsc ; oscillator at eight consecutive wavetable buffers, mouse selects ; requires=tbl
let n = 8
    b = control kr "tbl" 0
    x = mouseX kr b (b + n - 1) Linear 0.1
    y = mouseY kr 0.01 0.2 Exponential 0.2
in vOsc ar x (mce [120, 121]) 0 * y

---- ; setup ; allocate and fill tables 0 to 7
gen_harm i = let {square a = a * a ; n = square (fromIntegral i + 1) ; f j = square ((n - j) / n) } in map f [0 .. n - 1]
gen_setup i = [b_alloc i 1024 1,b_gen_sine1 i [Normalise,Wavetable,Clear] (gen_harm i)]
withSc3 (mapM_ maybe_async (concatMap gen_setup [0 .. 7]))

---- ; drawings
Sound.Sc3.Plot.plot_p1_imp [gen_harm 7]

---- ; setup ; reallocate buffers while oscillator is running
resetTable i = do {h <- Sound.Sc3.Lang.Random.IO.nrrand 12 0 1; Sound.OSC.sendMessage (b_gen_sine1 i [Normalise,Wavetable,Clear] h)}
withSc3 (mapM_ resetTable [0 .. 7])
