2016-12-08 4 views
2

Я пытаюсь установить значение скорости, значение которого находится в среднем сигнале для усиления. Скорость колеблется от 0 до 127.Объемная скорость для получения веб-звука

Документация на web audio api, хотя и хорошо сделана, на самом деле ничего не говорит об этом.

В настоящее время у меня есть это, чтобы играть звуки:

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); 
    }); 
    } 

я не нашел ничего, чтобы использовать значения скорости в диапазоне от 0 до 127. Тем не менее, я нашел gain node, который применяется коэффициент усиления.

Так что моя функция теперь это:

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 ... если я применяю миди значение скорости для усиления, я, очевидно, есть звук, который безумно громко. Поэтому я хотел бы знать любой из этих двух вопросов:

  • Могу ли я как-то использовать значение скорости напрямую?
  • Как преобразовать значение скорости для усиления?

ответ

2

MIDI specification говорит:

Интерпретация Velocity байт осталось до приемного устройства. Как правило, чем больше числовое значение сообщения, тем сильнее эффект управления скоростью. Если, например, скорость применяется к объему (выходному уровню), то более высокие значения скорости будут генерировать более громкие ноты. Значение 64 (40H) соответствует значению меццо-фортепиано [...]. Предпочтительно, чтобы применение скорости к объему должно быть экспоненциальной функцией.

Технические характеристики General MIDI не являются более конкретными.

DLS Level 1 specification говорит: Значение скорости

MIDI-Примечание преобразуется в затухания в дБ с помощью вогнутого преобразования в соответствии со следующей формулой:

Atten дБ = 20 × журнал (127 /Скорость)

и подается для управления уровнем громкости или генератора огибающей.

Вам необходимо сопоставить это затухание с коэффициентом усиления, то есть gain = velocity²/127².

И многие аппаратные синтезаторы позволяют выбирать различные кривые для отображения скорости на громкость.

+0

Спасибо, я попробовал это. Результат был тихим, может быть, потому, что я, возможно, неправильно понял то, что вы имели в виду под «вам нужно сопоставить это ослабление с коэффициентом усиления». В любом случае, опробовав разные формулы, я нашел тот, который я нахожу достаточно хорошим в динамике, которую он обеспечивает (коэффициент усиления = скорость²/6400). Это может быть не научно достоверно, но с вашей формулой у меня было 8 дБ для 80-скоростного 20 * log (16129/6400) = 8. Это еще и слишком загруженная. Я соглашусь с ответом, потому что это кажется правильным, но я не думаю, что буду использовать. – Ced

+0

Чтобы отобразить дБ на линейный коэффициент (если это то, что использует узел усиления), отбросьте логарифм 20 * и обратите внимание, что затухание противоположно коэффициенту усиления. Таким образом, коэффициент усиления будет «скорость2/127²». –

0

Я не знаю, если это правильно, потому что я не знаю, что многое о звуке, но это похоже на работу:

this.gainNode.gain.value = скорость/100;

Так скорость 127 = прирост 1,27

В конце концов, я думаю, что лучше делит 1 в 127 значений, и каждый из них соответствует их соответствующим миди значения. Однако код проще, так что да, он работает.