rserota / wad

Web Audio DAW. Use the Web Audio API for dynamic sound synthesis. It's like jQuery for your ears.
MIT License
1.88k stars 160 forks source link

TypeScript Typings #134

Closed sebastiansandqvist closed 1 year ago

sebastiansandqvist commented 3 years ago

I have been using wad for a few projects and recently began using TypeScript, which made interfacing with this library a bit more difficult. As a result I've come up with some incomplete type definitions that have gotten me pretty far for my own projects, pasted below (based on the API documentation in the readme).

Is there any interest in me opening a PR in order to kickstart adding more complete type definitions for this library? In case it is useful to anyone else, the typedefs I've been using (which don't currently include anything for polywads) are here:

declare module 'web-audio-daw' {

  interface Envelope {
    attack?: number;
    decay?: number;
    sustain?: number;
    hold?: number;
    release?: number;
  }

  interface Filter {
    type: 'lowpass' | 'highpass' | 'bandpass' | 'lowshelf' | 'highshelf' | 'peaking' | 'notch' | 'allpass';
    frequency: number;
    q: number;
    env?: {
      frequency?: number;
      attack?: number;
    }
  }

  interface Reverb {
    wet?: number;
    impulse?: string;
  }

  interface Delay {
    delayTime?: number;
    wet?: number;
    feedback?: number;
  }

  type Shape = 'sine' | 'sawtooth' | 'square' | 'triangle';

  interface Vibrato {
    shape?: Shape;
    magnitude?: number;
    speed?: number;
    attack?: number;
  }

  interface Tremolo {
    shape?: Shape;
    magnitude?: number;
    speed?: number;
    attack?: number;
  }

  interface ConstructorArgs {
    source: string;
    volume?: number;
    loop?: boolean;
    rate?: number;
    pitch?: string | number;
    detune?: number;
    panning?: number | number[];
    panningModel?: 'HRTF' | 'equalpower';
    rolloffFactor?: number;
    env?: Envelope;
    filter?: Filter;
    reverb?: Reverb;
    delay?: Delay;
    vibrato?: Vibrato;
    tuna?: any;
  }

  interface PlayArgs {
    volume?: number;
    wait?: number;
    loop?: boolean;
    offset?: number;
    rate?: number;
    pitch?: string;
    label?: string;
    env?: Envelope;
    panning?: number | number[];
    filter?: Filter;
    delay?: Delay;
  }

  class Wad {
    constructor(args: ConstructorArgs);
    public static audioContext: AudioContext;
    play: (args?: PlayArgs) => Promise<this>;
    stop: (label?: string) => void;
    pause: (label?: string) => void;
    unpause: (args?: PlayArgs) => void;
    setVolume: (volume: number, timeConstant?: string, label?: string) => void;
    setPitch: (pitch: string, timeConstant?: string, label?: string) => void;
    setDetune: (detune: number, timeConstant?: string, label?: string) => void;
    setPanning: (panning: {} | any[], timeConstant?: string) => void;
    setRate: (rate: number) => void;
    setReverb: (wet: number) => void;
    setDelay: (delayTime?: number, wet?: number, feedback?: number) => void;
    reverse: () => void;
  }

  export = Wad;
}
rserota commented 3 years ago

That sounds great. Feel free to open a PR.

frastlin commented 2 years ago

Yes, I would love some typings for Wad.

rserota commented 1 year ago

I just updated WadJS to version 4.13, which includes type definitions. I hope you all enjoy it.