2016-12-08 6 views
2

ベロシティ値を設定しようとしています。ベロシティの範囲は0〜127です。ウェブ音量を得る音量ベロシティ

web audio apiのドキュメントは実際にはこれについて何も言いません。私は、ゲインを適用gain nodeを見つけましたが、0から127までの範囲で速度値を使用するために何かを見つけることができませんでした

play(key, startTime) {  
    this.audioContext.decodeAudioData(this.soundContainer[key], (buffer) => { 
     let source = this.audioContext.createBufferSource(); 
     source.buffer = buffer;     
     source.connect(this.audioContext.destination); 
     source.start(startTime); 
    }); 
    } 

:私はサウンドを再生するには、このをした瞬間に

だから私の機能は今、このです:

play(key:string, startTime, velocity) {  
    this.audioContext.decodeAudioData(this.soundContainer[key], (buffer) => { 
     let source = this.audioContext.createBufferSource(); 
     source.buffer = buffer;     
     source.connect(this.gainNode); 
     this.gainNode.connect(this.audioContext.destination); 
     this.gainNode.gain.value = velocity; 
     source.start(startTime); 
    }); 
    } 

Eehhh ...私はゲインにMIDIベロシティ値を適用した場合、私は明らかにめちゃくちゃ大声で音を持っています。だから私はこれらの2つの質問のいずれかを知りたいと思います:

  • 私は何とか速度値を直接使用できますか?
  • どのようにしてベロシティ値をゲインに変換できますか?

答えて

2

MIDI specificationは言う:ベロシティバイトの

解釈は、受信機器に任されています。一般に、メッセージの数値が大きいほど、速度制御効果が強くなります。例えば、ベロシティがボリューム(出力レベル)に適用されると、ベロシティの値が大きくなるほど、より大きなノートが生成されます。 64(40H)の値はメゾ・フォルト・ノートに対応します。[...]ボリュームへの速度の適用は、指数関数でなければなりません。

一般的なMIDI仕様は、もはや具体的ではありません。

DLS Level 1 specificationと言う:

MIDIノート速度値が凹面によってdB単位の減衰に変換され、以下の式に従って変換:

ATTEN デシベル = 20×ログ(127 /速度

であり、ボリュームまたはエンベロープジェネレータのピークレベルのいずれかを制御するために供給されます。

この減衰量をゲイン係数、つまりgain = velocity²/127²にマッピングする必要があります。

多くのハードウェアシンセサイザでは、速度をボリュームにマッピングするためにさまざまなカーブを選択できます。

+0

ありがとう、私はこれを試しました。結果は静かで畏敬の念でした。なぜなら、あなたが「この減衰量をゲイン係数にマッピングしなければならない」ということを誤解していたかもしれないからです。とにかく、別の数式を試してみると、私はそれが提供するダイナミクス(gain =velocity²/ 6400)で十分に良いものを見つけました。それは科学的に正確ではないかもしれませんが、あなたの公式で私は80速度20 * log(16129/6400)= 8に対して8 dbゲインを得ました。私は正しいと思われるので答えを受け入れるだろうが、それは私が推測するものではない。 – Ced

+0

dBを線形因数にマッピングするには(利得ノードが使用する場合)、20 *対数を落とし、減衰は利得の逆であることに注意してください。ゲイン係数は 'velocity²/127²'になります。 –

0

それが正しければ、私は音についてその多くを知らないが、これが動作するように見えるので、私は、知らない:

this.gainNode.gain.value =速度/ 100;

だから127の速度は、最終的に、私はよりよい127個の値に1を分割し、それらの各々は、それぞれのMIDI値に対応しているものと思う

1.27の利得を=。しかし、コードはこのように簡単ですので、うまく動作します。

関連する問題