MzxBox

catalogTestFilter.json

{
	"label": "Test Filter Plugin",
	"purpose": "Filter",
	"kind": "tesFilterPluginV1_0",
	"ui": "http://127.0.0.1:8080/filter/ui3.html",
	"evaluate": "createNewTestFilterPlugin",
	"script": "http://127.0.0.1:8080/filter/plugin3.js"
}

plugin3.ts

function createNewTestFilterPlugin() {
	let audioContext = null;
	let inputGainNode;
	let outputGainNode;
	let flanger;
	let properties = {
		speed: 1
	};

	function flangerNode(audioContext, fromNode, toNode) {
		let inputGainNode = audioContext.createGain();
		let wetGainNode = audioContext.createGain();
		let delayNode = audioContext.createDelay();
		let gainNode = audioContext.createGain();
		let feedbackGainNode = audioContext.createGain();
		let oscillatorNode = audioContext.createOscillator();

		oscillatorNode.connect(gainNode);
		gainNode.connect(delayNode.delayTime);
		inputGainNode.connect(wetGainNode);
		inputGainNode.connect(delayNode);
		delayNode.connect(wetGainNode);
		delayNode.connect(feedbackGainNode);
		feedbackGainNode.connect(inputGainNode);

		oscillatorNode.type = 'sine';
		oscillatorNode.start(0);

		this.reset = function (delay, depth, feedback, speed) {
			delayNode.delayTime.value = delay;
			gainNode.gain.value = depth;
			feedbackGainNode.gain.value = feedback;
			oscillatorNode.frequency.value = speed;
		};
		fromNode.connect(inputGainNode);
		wetGainNode.connect(toNode);
		this.reset(0.005, 0.01, 0.5, 0.25);
		return this;
	}
	return {
		launch: (context, parameters) => {
			if (!(inputGainNode)) {
				audioContext = context;

				inputGainNode = audioContext.createGain();
				outputGainNode = audioContext.createGain();
				flanger = flangerNode(audioContext, inputGainNode, outputGainNode);

			}
			if (parameters) {
				properties = parameters;
				flanger.reset(0.005, 0.01, 0.5, properties.speed);
			}
		},
		busy: () => {
			return false;
		},
		schedule: (when, tempo, parameters) => {
			if (parameters) {
				let point = parameters;
				flanger.speed = point.speed;
				flanger.reset(0.005, 0.01, 0.5, point.speed);
			}
		},
		output: () => {
			return outputGainNode;
		},
		input: () => {
			return inputGainNode;
		}
	};
}

ui3.html

<html>

<head>
	<style>
		body {
			background: silver;
		}
	</style>
</head>

<body>
	<h1>Test Filter Plugin</h1>
	<p>Flanger speed</p>
	<p><input type="range" id="flangerslider" min="0.05" max="0.5" step="0.05" onchange="setSpeed(this.value);" /></p>
</body>
<script>
	let dialigId = '';
	let properties = {
		speed: 0.25
	};

	function setSpeed(ss) {
		properties.speed = ss;
		postMessageToHost();
	}

	function onHostMessage(messageEvent) {
		if (dialigId) {
			if (messageEvent.data.hostData) {
				properties = messageEvent.data.hostData;
				setSpeed(properties.speed);
			}
			document.getElementById('flangerslider').value = properties.speed;
		} 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