TR-909 クローンのファームウェア、あまり深く考えずに C で書き始めましたけど、どうもちょいちょい「これは、C++ のほうがよくない?」という場面にあたります。
例えばこんなところ
void TriggerRimShot(int8_t velocity) {
SET_BIT(PORT_TRIG_RIM_SHOT, BIT_TRIG_RIM_SHOT);
SET_BIT(PORT_LED_RIM_SHOT, BIT_LED_RIM_SHOT);
g_rim_shot.status = 255;
}
この関数にはこんなマクロが参照されています
#define SET_BIT(port, bit) (port) |= _BV(bit)
#define PORT_TRIG_RIM_SHOT PORTD
#define BIT_TRIG_RIM_SHOT PD0
なんというか。マクロだらけです。けっこう危ないコードだしメンテも大変そうです。他にもこんなところ
void CheckSwitches(uint8_t prev_switches, uint8_t new_switches) {
if ((prev_switches ^ new_switches) == 0) {
return;
}
if (IS_RIM_SHOT_ON(new_switches)) {
TriggerRimShort(127);
}
if (IS_OPEN_HI_HAT_ON(new_switches)) {
TriggerOpenHiHat(127);
}
if (IS_CLOSED_HI_HAT_ON(new_switches)) {
TriggerClosedHiHat(127);
}
}
スイッチが押されるのを検知する関数ですが、マクロを使うわ微妙に違う似たようなパタンの繰り返しになるわ。実行速度を考えるとループを回したり関数ポインタを使った汎用ルーチンを使ったりは避けたいですけど、すぐにメンテが大変なことになりそうです。これ、テンプレートが使えないかな?
てな風に、C++ で書いた方がいいんじゃね?感がどんどん増してきました。8bit プロセッサのコードを C++ で書くのはあまりやったことがありませんがどんな感じなりそうか見てみました。