←Previous | 1 2 3 4
  case "opmintb":
    opmIntB (opmPortArray[command.p]);
    break;
  case "pcmset":
    pcmSet (command.d, command.f, command.l, command.r);
    break;
  case "pcmstart":
    pcmStart ();
    break;
  case "pcmstop":
    pcmStop ();
    break;
  }
}



class OpmpcmProcessor extends AudioWorkletProcessor {

  //コンストラクタ
  constructor (options) {
    super (options);
    opmpcmProcessor = this;
    //OPM
    opmInit ();
    //PCM
    pcmInit ();
    //内部バッファ
    internalBufferLeft = new Float32Array (INTERNAL_BUFFER_FRAMES);  //内部バッファ左
    internalBufferRight = new Float32Array (INTERNAL_BUFFER_FRAMES);  //内部バッファ右
    internalBufferTime = currentTime;  //内部バッファを次に構築する時刻
    //外部バッファ
    externalSampleRate = sampleRate;  //外部サンプリング周波数。48000Hz、44100Hzなど
    externalBufferFrames =  floor (externalSampleRate * INTERNAL_BUFFER_MSEC / 1000);  //外部バッファのフレーム数
    externalToInternal = new Int32Array (externalBufferFrames);  //外部バッファのインデックスを内部バッファのインデックスに変換するテーブル
    for (let i = 0; i < externalBufferFrames; i++) {
      externalToInternal[i] = floor ((i * INTERNAL_BUFFER_FRAMES) / externalBufferFrames);
    }
    externalBufferPointer = externalBufferFrames;  //外部バッファから次に読み出す位置
    //コマンドキュー
    commandQueue = [];  //コマンドキュー
    commandTime = 0;
    this.port.onmessage = e => {
      addCommand (e.data);
    };
    this.port.start ();
  }

  //プロセッサ
  process (inputs, outputs, parameters) {
    let outputBufferLeft = outputs[0][0];  //出力バッファ左
    let outputBufferRight = outputs[0][1];  //出力バッファ右
    let p = externalBufferPointer;  //外部バッファから次に読み出す位置
    let o = 0;  //出力バッファに次に書き込む位置
    let r = outputBufferLeft.length;  //出力バッファの残りフレーム数
    while (r) {
      if (p == externalBufferFrames) {  //バッファの末尾
        //内部バッファを構築する
        let startTime = internalBufferTime;  //開始時刻
        let endTime = startTime + INTERNAL_BUFFER_MSEC / 1000;  //終了時刻
        internalBufferTime = endTime;
        let from = 0;  //構築開始位置
        if (false) {
          while (0 < commandQueue.length && commandQueue[0].t < endTime) {
            let command = commandQueue.shift ();
            let to = floor ((command.t - startTime) * INTERNAL_SAMPLE_RATE);  //構築終了位置
            if (from < to) {
              audioAdvance (from, to);
              from = to;
            }
            execCommand (command);
          }
        } else {
          while (0 < commandQueue.length) {  //時刻を無視してすべてのコマンドを実行する
            let command = commandQueue.shift ();
            execCommand (command);
          }
        }
        if (from < INTERNAL_BUFFER_FRAMES) {
          audioAdvance (from, INTERNAL_BUFFER_FRAMES);
        }
        p = 0;  //外部バッファから次に読み出す位置
      }
      //出力バッファに転送する
      let n = min2 (r, externalBufferFrames - p);  //今回転送するフレーム数
      let q = p + n;
      while (p < q) {
        let s = externalToInternal[p];
        outputBufferLeft[o] = internalBufferLeft[s];
        outputBufferRight[o] = internalBufferRight[s];
        o++;
        p++;
      }
      r -= n;
    }
    externalBufferPointer = p;  //外部バッファから次に読み出す位置
    return true;  //継続
  }

}

registerProcessor ("opmpcm-processor", OpmpcmProcessor);
←Previous | 1 2 3 4