Extra "ports" of juce-based plugins using the distrho build system
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.1KB

  1. --[[
  2. name: sine organ
  3. description: A simple organ-like sinewave VST/AU.
  4. author: osar.fr
  5. --]]
  6. require "include/protoplug"
  7. local release = 10000
  8. local decayRate = 1/release
  9. polyGen.initTracks(8)
  10. function polyGen.VTrack:init()
  11. -- create per-track fields here
  12. self.phase = 0
  13. self.releasePos = release
  14. end
  15. function polyGen.VTrack:addProcessBlock(samples, smax)
  16. local amp = 1
  17. for i = 0,smax do
  18. if not self.noteIsOn then
  19. -- release is finished : idle track
  20. if self.releasePos>=release then break end
  21. -- release is under way
  22. amp = 1-self.releasePos*decayRate
  23. self.releasePos = self.releasePos+1
  24. end
  25. self.phase = self.phase + (self.noteFreq*math.pi*2)
  26. -- math.sin is slow but once per sample is no tragedy
  27. local trackSample = math.sin(self.phase)*amp*0.3
  28. samples[0][i] = samples[0][i] + trackSample -- left
  29. samples[1][i] = samples[1][i] + trackSample -- right
  30. end
  31. end
  32. function polyGen.VTrack:noteOff(note, ev)
  33. self.releasePos = 0
  34. end
  35. function polyGen.VTrack:noteOn(note, vel, ev)
  36. -- start the sinewave at 0 for a clickless attack
  37. self.phase = 0
  38. end