catalogTestSampler.json
{
"label": "Test Sampler Plugin",
"purpose": "Sampler",
"kind": "tesSamplerPluginV1_0",
"ui": "http://127.0.0.1:8080/sampler/ui2.html",
"evaluate": "createNewTestSamplerPlugin",
"script": "http://127.0.0.1:8080/sampler/plugin2.js"
}plugin2.js
function createNewTestSamplerPlugin() {
let audioContext = null;
let outputVolume = null;
let properties = {
volume: 0.7,
ratio: 1
};
let noiseBuffer;
let nodes = [];
return {
launch: (context, parameters) => {
if (!(outputVolume)) {
audioContext = context;
outputVolume = audioContext.createGain();
noiseBuffer = audioContext.createBuffer(1, 12345, audioContext.sampleRate);
for (let ii = 0; ii < noiseBuffer.getChannelData(0).length; ii++) {
noiseBuffer.getChannelData(0)[ii] = Math.random() * 2 - 1;
}
}
if (parameters) {
properties = parameters;
}
outputVolume.gain.value = properties.volume;
},
busy: () => {
return false;
},
duration: () => {
return 0.25;
},
start: (when, tempo) => {
const boom = audioContext.createBufferSource();
boom.buffer = noiseBuffer;
boom.playbackRate.value = properties.ratio;
boom.loop = true;
boom.loopStart = Math.random() * 1.0;
boom.connect(outputVolume);
boom.start(when);
boom.stop(when + 0.25);
nodes.push(boom);
},
cancel: () => {
nodes.forEach((node) => {
node.disconnect();
});
nodes = [];
},
output: () => {
return outputVolume;
}
};
}ui2.html
<html>
<head>
<style>
body {
background: silver;
}
</style>
</head>
<body>
<h1>Test Sampler Plugin</h1>
<p>Volume</p>
<p><input type="range" id="volumeslider" min="0" max="1" step="0.1" onchange="setVolume(this.value);" /></p>
<p>Pitch ratio</p>
<p><input type="range" id="pitchslider" min="0.25" max="3" step="0.1" onchange="setRatio(this.value);" /></p>
</body>
<script>
let dialigId = '';
let properties = {
volume: 0.7,
ratio: 1
};
function setRatio(rr) {
properties.ratio = rr;
postMessageToHost();
}
function setVolume(nn) {
properties.volume = nn;
postMessageToHost();
}
function onHostMessage(messageEvent) {
if (dialigId) {
if (messageEvent.data.hostData) {
properties = messageEvent.data.hostData;
}
document.getElementById('volumeslider').value = properties.volume;
document.getElementById('pitchslider').value = properties.ratio;
} else {
dialigId = messageEvent.data.hostData;
}
}
function postMessageToHost() {
window.parent.postMessage({
dialogID: dialigId,
pluginData: properties,
done: false,
screenWait: false
}, '*');
}
window.addEventListener('message', onHostMessage, false);
postMessageToHost();
</script>
</html>