    --[[
    name: sine organ
    description: A simple organ-like sinewave VST/AU.
    author: osar.fr
    --]]

    require "include/protoplug"

    local release = 10000
    local decayRate = 1/release

    polyGen.initTracks(8)

    function polyGen.VTrack:init()
    	-- create per-track fields here
    	self.phase = 0
    	self.releasePos = release
    end

    function polyGen.VTrack:addProcessBlock(samples, smax)
    	local amp = 1
    	for i = 0,smax do
    		if not self.noteIsOn then
    			-- release is finished : idle track
    			if self.releasePos>=release then break end
    			-- release is under way
    			amp = 1-self.releasePos*decayRate
    			self.releasePos = self.releasePos+1
    		end
    		self.phase = self.phase + (self.noteFreq*math.pi*2)
    		-- math.sin is slow but once per sample is no tragedy
    		local trackSample = math.sin(self.phase)*amp*0.3
    		samples[0][i] = samples[0][i] + trackSample -- left
    		samples[1][i] = samples[1][i] + trackSample -- right
    	end
    end

    function polyGen.VTrack:noteOff(note, ev)
    	self.releasePos = 0
    end

    function polyGen.VTrack:noteOn(note, vel, ev)
    	-- start the sinewave at 0 for a clickless attack
    	self.phase = 0
    end

generated by LDoc 1.4.2