RolandJansen/intermix.js

View on GitHub
src/plugins/Delay.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { AbstractPlugin } from "../registry/AbstractPlugin";
import { Tuple } from "../interfaces/interfaces";
import { IOscActionDef } from "../interfaces/IActions";
import { IPlugin, IPluginConstructor, IPluginMetaData } from "../interfaces/IRegistryItems";

const Plugin: IPluginConstructor = class Delay extends AbstractPlugin implements IPlugin {
    public static readonly METADATA: IPluginMetaData = {
        type: "fx",
        name: "Intermix Delay",
        version: "1.0.0",
        authors: "R. Jansen",
        desc: "A simple echo effect",
    };
    private static readonly PREFIX = "/intermix/plugin/<UID>/";
    private static readonly DELAYTIME_SEC = 0.125; // 1/8 note at 120bpm

    public readonly actionDefs: IOscActionDef[] = [
        {
            address: Delay.PREFIX + "delayTime_sec",
            typeTag: ",i",
            value: Delay.DELAYTIME_SEC,
            description: "The delay time in seconds",
        },
    ];

    private inputSplitter = this.ac.createChannelSplitter(2);
    private delayBuffer = this.ac.createDelay();
    private delayLoop = this.ac.createGain();
    private outGain = this.ac.createGain();

    public get inputs(): AudioNode[] {
        return [this.inputSplitter];
    }

    public get outputs(): AudioNode[] {
        return [this.outGain];
    }

    constructor(public readonly uid: string, private ac: AudioContext) {
        super();
        this.wireAudioNodes();
        this.delayBuffer.delayTime.value = Delay.DELAYTIME_SEC;
        this.delayLoop.gain.value = 0.3;
    }

    public onChange(changed: Tuple): boolean {
        switch (changed[0]) {
            case "delayTime_sec":
                return true;
            default:
                return this.onChangeDefault(changed);
        }
    }

    private wireAudioNodes(): void {
        this.inputSplitter.connect(this.delayBuffer);
        this.inputSplitter.connect(this.outGain);

        this.delayBuffer.connect(this.delayLoop);
        this.delayLoop.connect(this.delayBuffer);

        this.delayBuffer.connect(this.outGain);
    }
};
export default Plugin;