diff --git a/lib/Engine_MxSamples.sc b/lib/Engine_MxSamples.sc index 1f6c39f..f4c9821 100644 --- a/lib/Engine_MxSamples.sc +++ b/lib/Engine_MxSamples.sc @@ -6,8 +6,8 @@ Engine_MxSamples : CroneEngine { // MxSamples specific var sampleBuffMxSamples; var sampleBuffMxSamplesDelay; - var samplerPlayerMxSamples; - var mxsamplesVoices=30; + var mxsamplesMaxVoices=40; + var mxsamplesVoiceAlloc; // MxSamples ^ *new { arg context, doneCallback; @@ -15,17 +15,19 @@ Engine_MxSamples : CroneEngine { } alloc { + mxsamplesVoiceAlloc=Dictionary.new(mxsamplesMaxVoices); + + context.server.sync; sampleBuffMxSamples = Array.fill(80, { arg i; Buffer.new(context.server); }); - sampleBuffMxSamplesDelay = Array.fill(mxsamplesVoices, { arg i; + sampleBuffMxSamplesDelay = Array.fill(mxsamplesMaxVoices, { arg i; Buffer.alloc(context.server,48000,2); }); - (0..(mxsamplesVoices-1)).do({arg i; - SynthDef("player"++i,{ - arg bufnum,bufnumDelay, amp, t_trig=0,envgate=1, + SynthDef("mxPlayer",{ + arg bufnum,bufnumDelay, amp, t_trig=0,envgate=1,name=1, attack=0.015,decay=1,release=2,sustain=0.9, sampleStart=0,sampleEnd=1,rate=1,pan=0, lpf=20000,hpf=10, @@ -64,22 +66,12 @@ Engine_MxSamples : CroneEngine { )); // delay w/ 30 voices = 1.5% (one core) per voice // w/o delay w/ 30 voices = 1.1% (one core) per voice + // SendTrig.kr(Impulse.kr(1),name,1); + DetectSilence.ar(snd,doneAction:2); + // just in case, release after 1 minute + FreeSelf.kr(TDelay.kr(DC.kr(1),60)); Out.ar(0,snd) - }).add; - }); - - samplerPlayerMxSamples = Array.fill(mxsamplesVoices,{arg i; - Synth("player"++i, [\bufnumDelay,sampleBuffMxSamplesDelay[i]],target:context.xg); - }); - - this.addCommand("mxsamplesvoicenum","i", { arg msg; - if (msg[1] 0 then clock.run(function() clock.sleep(0.5) - self.voice[voice_i].active={name="",midi=0} engine.mxsamplesoff(voice_i) end) end diff --git a/mx.samples.lua b/mx.samples.lua index 642b88d..679250f 100644 --- a/mx.samples.lua +++ b/mx.samples.lua @@ -1,4 +1,4 @@ --- mx.samples v1.2.0 +-- mx.samples v1.3.0 -- download and play samples -- -- llllllll.co/t/mxsamples @@ -49,15 +49,28 @@ function init() cmd="mkdir -p ".._path.audio.."mx.samples/" print(cmd) os.execute(cmd) - + skeys=mxsamples:new() update_uilist() setup_midi() + local f=io.open(_path.data.."mx.samples/last","rb") + if f~=nil then + local content=f:read("*all") + f:close() + local last_instrument_current = tonumber(content) + if last_instrument_current ~= nil then + instrument_current=last_instrument_current + uilist.index=instrument_current + update_uilist() + end + end + + print("available instruments: ") tab.print(skeys:list_instruments()) - clock.run(redraw_clock) + clock.run(redraw_clock) end @@ -143,9 +156,9 @@ function update_uilist() end table.insert(items,s) end - local index = 1 - if uilist ~= nil then - index = uilist.index + local index=1 + if uilist~=nil then + index=uilist.index end uilist=UI.ScrollingList.new(0,0,index,items) end @@ -170,6 +183,9 @@ function key(k,z) local i=uilist.index if available_instruments[i].downloaded then instrument_current=i + f=io.open(_path.data.."mx.samples/last","w") + f:write(instrument_current) + f:close() update_uilist() elseif download_available>0 then if k==2 then @@ -207,14 +223,14 @@ function download(id) cmd="unzip "..download_file.." -d ".._path.audio.."mx.samples/"..id.."/" print(cmd) os.execute(cmd) - cmd = "rm "..download_file + cmd="rm "..download_file print(cmd) os.execute(cmd) end function redraw_clock() -- our grid redraw clock while true do -- while it's running... - clock.sleep(1/30) -- refresh + clock.sleep(1/10) -- refresh redraw() end end