Here is some sample code that exhibits the problem (wav file
here). I used PlaySampleCrossfade.java as my template for queueing the loop. Maybe I'm doing something wrong? Maybe it's my system? Thanks for any advice.
import com.jsyn.JSyn
import com.jsyn.data.SequentialData
import com.jsyn.ports.UnitDataQueuePort
import com.jsyn.ports.UnitOutputPort
import com.jsyn.unitgen.*
import com.jsyn.util.SampleLoader
import kotlin.io.path.Path
private fun main() {
val synth = JSyn.createSynthesizer()
val lineout = LineOut()
val hum = SampleLooper("/tmp/hum.wav")
synth.add(hum)
synth.add(lineout)
hum.output.connect(lineout.input)
lineout.start()
synth.start()
}
class SampleLooper(filename: String) : Circuit() {
private val reader: VariableRateDataReader
private val mixer: MixerMonoRamped
val output: UnitOutputPort
init {
val sample = SampleLoader.loadFloatSample(Path(filename).toUri().toURL())
when (sample.channelsPerFrame) {
1 -> {
mixer = MixerMonoRamped(1)
reader = VariableRateMonoReader().apply { output.connect(0, mixer.input, 0) }
}
2 -> {
mixer = MixerMonoRamped(2)
reader = VariableRateStereoReader().apply {
output.connect(0, mixer.input, 0)
output.connect(1, mixer.input, 1)
}
}
else -> error("Can only play mono or stereo samples.")
}
reader.rate.set(sample.frameRate)
queueLoop(reader.dataQueue, sample)
add(reader)
add(mixer)
output = mixer.output
addPort(output)
}
private fun queueLoop(dataQueue: UnitDataQueuePort, queueableData: SequentialData) {
val loopCommand = dataQueue.createQueueDataCommand(queueableData, 3000, queueableData.numFrames - 6000).apply {
numLoops = -1
crossFadeIn = 3000 // arbitrary
}
dataQueue.queueCommand(loopCommand)
}
}