Arduinoのpow関数の速度を測る
MIDIのピッチベンドメッセージは、整数値から小数点の周波数倍率値を導き出して掛け算してさらに整数に丸めてレジスタに設定するという面倒な処理をしなければなりません。
一連の処理はFPUの無いCPUでは相当に負担がかかると思われるので大体近似して補間して単純な計算に変えたりテーブル参照にしたりしています。YMF825レガシーMIDIモジュールもテーブル参照方式にしています。
しかし、実際にどれだけ処理時間がかかるのか、確かめたことは無いので簡単な例で確かめてみました。
ロジックは YAMAHAのgithubから参照、、、YMF825用のfrac値を計算させてます。
https://github.com/yamaha-webmusic/ymf825board/tree/master/sample2
256段階の計算をしてみて millis()関数で処理時間を測ってみました。
###コード
/*
* Pow(2,...) Speed
*
* ringoro
*/
#include <math.h>
void setup() {
Serial.begin(9600);
}
bool first=true;
void loop() {
float x,y,cent;
int i,d[256];
unsigned long time1,time2;
if(!first)
{ return;}
first=false;
time1= millis();
for(i=0;i<256;i++){
x = (i-128);
y = pow( 2,(x/128) );
d[i]=(int)(y*512+0.5);
}
time2= millis();
Serial.println(time1);
Serial.println(time2);
Serial.println("----");
for(i=0;i<256;i++){
Serial.println(d[i]);
}
}
結果
0
72
----
256
257
259
260
262
:
:
991
997
1002
1007
1013
1018
最初の2つの数字がmillis()の結果で256回のpowと整数値代入で 72msec と見られます。一回の処理に約0.28msecかかっているという勘定です。
また、最後の値 x=255 の場合は計算値では1018 でシンセサイザ的には1023,または1024を設定値にしておきたいところです。テーブル参照ではこの辺りを補正できるのですが補正処理もどこかでしないといけないのでまたちょと処理時間は加算されると思います。
1ピッチベンドメッセージ当たり0.28msec程度なら実装しても問題ないかなと思われますが、、とりあえずご参考まで。