export default ({ numberOfChannels, length, sampleRate }: { numberOfChannels: number, length: number, sampleRate: number }) => {
  const channels: Float32Array[] = [];
  if (numberOfChannels > 32) {
    throw new DOMException(`Failed to construct 'AudioBuffer': The number of channels provided (${numberOfChannels}) is outside the range [1, 32].`);
  } else if (length < 0) {
    throw new DOMException(`Failed to construct 'AudioBuffer': The length provided (${length}) is negative.`);
  }
  for (let i = 0; i < numberOfChannels; i ++) {
    channels.push(new Float32Array(length));
  }
  return {
    get duration() {
      return length / sampleRate;
    },
    get sampleRate() {
      return sampleRate;
    },
    get length() {
      return length;
    },
    get numberOfChannels() {
      return numberOfChannels;
    },
    getChannelData(index: number) {
      return channels[index];
    },
    copyToChannel(source: Float32Array, channelNumber: number, startInChannel: number = 0) {
      channels[channelNumber].set(source.slice(0, Math.min(source.length, channels[channelNumber].length - startInChannel)), startInChannel);
    },
    copyFromChannel(destination: Float32Array, channelNumber: number, startInChannel: number = 0) {
      destination.set(
        channels[channelNumber].slice(
          startInChannel,
          Math.min(destination.length - startInChannel, channels[channelNumber].length)
        )
      );
    }
  }
}
