MzxBox

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>

Proudly powered by WordPress