日本語が、大好きです。(Sorry, Japanese Only.)
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
<< 2024 November >>

no fun nolife
NEW ENTRIES
RECENT COMMENTS
CATEGORIES
rss
 はてなアンテナに追加
 はてなRSSに登録
 Bloglinesで閲読登録
 Subscribe with livedoor Reader
 Add to Google
 My Yahoo!に追加
LINK
ARCHIVES
music
LOGIN
現在のモード: ゲストモード
USER ID:
PASS:
logout
 M3の準備および、クレポに向けて、作業を停止していたArduinoの作業を再開。する前に、とりあえず「おさらい」しないとね。っていうので、以前も成功している、MIDIを使ってEA1を鳴らしてみた。

 ・・っつても、ただ鳴らすだけなら前のスケッチそのままロードすりゃいいので、もうちょっと難易度上げて。ここまで作ってきたクラスの実装も試してみた。

・GMidioutDummyクラスを使った、midi出力のデバッグ
・AnalogValueクラスを使ったアナログ入力。


 どちらも「実装を簡単にする」事を念頭に作ったので、簡単に実装できる。・・・・・はずだったんだけど、AnalogValueはちょっとコケた。っつーのも、AnalogValueクラスのコンセプトに無理があったのだ。



 AnalogValueクラスのコンセプトは「int型と同じ様に使えて、アナログ特有のブレをなくす」っていうもので、このために値の設定をoperatorで実装していた。まあつまり「val = analogRead(0);」とさえやっておけば、後は自動で過去の値との平均値を取ってくれるんじゃね?ぐらいに思っていたんだけど、考えてみたら代入なんて、analogRead以外でも使う事があるわけで。それらの値で平均採ってもまともな数値になるわけねえよな。とかそういうアレ。


// ダイアルの値を読み込み(0~32)
val = analogRead(0);
val = (val >> 5) -1;
// 値をスケールのnote値に変換
note = (OCTAVE * 3) + scale_mBlues[val%size_mBlues] + (val/size_mBlues) * OCTAVE;


こんな感じでソースを書いちゃうと、もうまともに動く訳がない。結局、代入用と計算用に2つ値を用意する事になる



// ダイアルの値を読み込み(0~32)
val = analogRead(0);
val2 = val;
val2 = (val2 >> 5) -1;
// 値をスケールのnote値に変換
note = (OCTAVE * 3) + scale_mBlues[val2%size_mBlues] + (val2/size_mBlues) * OCTAVE;


でももうこんな事するなら、AnalogValueにget関数でもつけた方が安全だって事になる。トホホー。
ついでに、今のAnalogValueは、過去4回の平均値を採っているんだけど、これが反応速度に関わってきて(あたりまえだけど)思いの外具合が悪い。問題がないなら平均値は取っちゃった方がいいのかな。これもいろいろ考えた方がいいなあ。




Recent Entries from Same Category
HOTARU-YA(2009/10/22 3:25)
この手のプログラミングあんましたことないですけど、単なる平均でなくて、加重平均にしたら多少反応はマシになったりしません?新しい値は重く、古い値は軽く。
ここう(2009/10/22 22:27)
>螢屋さん
加重平均か。。それもアリかなって気もしますが、今回の場合、僕が勝手に「これは平均で行くべきだ」って先走りしたものの、結果としては「平均は不要かも」という状況です。加重平均とっても、数値のブレは防げなさそうですし。。。









    
処理時間 0.772828秒