最近の投稿

ページ: 1 ... 5 6 [7] 8 9 10
61
製作上のご質問 / Re:ミニ鍵盤で2オクターブ発生させたい
« 最新の投稿 by Gan 投稿日: 2月 10, 2019, 08:35:45 pm »
hyokure さん改造は進んでいるとのことで、すばらしいです。

いつも対応が遅めになって申し訳ないのですが、プログラムをしっかり読む時間がやっとできたので、ざっとプログラムの概要をまとめたいと思います。全部を説明するのは非常に長くなるので関係の深そうな部分に絞っています。もっと詳しい説明が必要なところがあったらお知らせください。

AVR のプログラムは、main() 関数から始まるので最初にここを読むと良いのですが、MiniBoard の main 関数は以下のようになっています。

コード: [Select]
int main(void) {
    iosetup();  // IO ポートを初期化
    init_uart();  // シリアルを初期化
    init_timer();  // タイマーを初期化
    init_midi_decoder();  // MIDI デコーダモジュールを初期化
    init_midi_controllers();  // MIDI コントローラモジュールを初期化
    key_prev = 0;
    tone_factor = 0;
    sei();
    // このループでは、MIDI 入力を監視し続けて入力があればデコードし CV と Gate として出力する
    while (true) {
        uint16_t rxByte = uart_getchar();
        if (rxByte != -1) {
            digest(rxByte);
        }
    }
}

MIDI を使わない場合、初期化が終わってしまったら、 main プログラムはループを空回りさせるだけで実質何もしません。

AVR マイクロプロセッサには、ペリフェラル(周辺装置?)といって、特定の仕事をするモジュールが何種類か内蔵されていて、MiniBoard はこれらのうち以下を使っています。これらが main プログラムの初期化部分で設定されています。init_uart() という関数と init_timer() という関数です。
  • UART (シリアル入力) -- MIDI 信号の読み取りに使う
  • Timer0 -- ノート(音階) CV の出力に使う (PWM という技術を使います)
  • Timer1 -- ベンド(音階) CV の出力に使う (PWM という技術を使います)
このうちキー読み取りに関連の深いのは Timer1 ですが詳細は後ろに書きます。

マイクロプロセッサのプログラミングでこの他に重要なのは、入出力ピンに適切な役割を設定することで、これは main 関数から呼ばれている iosetup() という関数で設定が行われています。ピンの割り当てについては後で書きます。

初期化の終わった main 関数が実質何もしないのにプログラムがどうやって働くかというと、割り込みという機能を使っています。割り込みは、何か「割り込みイベント」というコトが起こるたびにプロセッサの処理に割り込んで実行する関数です。割り込み関数は名前が決まっていて ISR() という名前の関数があれば、それが割り込みです(厳密には関数でなくてマクロなんですが細かいことは省略)。引数はイベントの種類でプロセッサが対応しているものがあらかじめ決められています。キーの読み取りで重要なのが Timer1 の周期が終わるたびに呼ばれる ISR(TIMER1_OVF_vect) です。この関数の中でキーの読み取りをしている、つまり Timer1 の周期が終わるたびにキーの読み取りが行われるのですが、その詳細に入る前に、キー読み取りに使われる入出力ピンの割り当てと押されたキーのデコード方法について説明します。

回路図を見てもわかるかと思いますが、キーの読み取りには 4本の入出力ピンが使われています。それらは、PB4 (16), PB5 (17), PB6 (18), PB7 (19) です。かっこの中はピン番号ですがプログラムの中には出て来ず、PBx という記述で表されます。ATTiny2313 には A, B, D という三種類の入出力ポートがあって、プログラム内では、PORTA, PORTB, PORTD (出力), PINA, PINB, PIND (入力) という特殊な 8ビット整数の形で読み書きができます。PB4, PB5, PB6, PB7 というのは、8ビットのうち、0 から始まって 4, 5, 6, 7 番目のビットに割り当てられているという意味です(要は上位4ビットです)。

次に MiniBoard のハードウェア部分ですが、ダイオードを使って、押したキーが二進数に変換されるようになっています。割り当ては以下の通りです。プログラム内部でビットを反転して読み取るので内部での値は表の右端のようになります。
状態PB7PB6PB5PB4値(反転)
何も押していない11110xf0x0
lowC11100xe0x1
C#11010xd0x2
D11000xc0x3
D#10110xb0x4
E10100xa0x5
F10010x90x6
F#10000x80x7
G01110x70x8
G#01100x60x9
A01010x50xa
A#01000x40xb
B00110x30xc
highC00100x20xd

ここで、Timer1 の割り込み関数を見てみると、以下のようになっています。この割り込み部分でキーの読み取りを行なっていて、改造するならこの部分のコード変更が必要です。
コード: [Select]
ISR(TIMER1_OVF_vect) {
    static uint16_t button_count = 0;
    uint8_t key;
    uint8_t octave;

    // ピッチベンド更新部は省略

    // check the keyboard
    octave = ((PIND >> 3) ^ 0x0f) * 12;  // オクターブスイッチを読み取り
    key = ((PINB >> 4) ^ 0x0f);  // PB4, PB5, PB6, PB7 を読み取り <-- キー数を拡張する場合ここを変更する必要あり
    if (key) {
        key += octave;
    }
    if (key != key_prev) {
        if (key_prev) {
            note_off(key_prev + C0);
        }
        if (key) {
            note_on(key + C0, 127);
        }
    }
    key_prev = key;

    if (! (PIND & _BV(PD2))) {
        ++button_count;
    }
    else {
        button_count = 0;
    }
    if (button_count >= 19531) {
        tone_factor ^= _BV(PORTB0);
        button_count = 0;
    }
}

読み取りの処理
コード: [Select]
key = ((PINB >> 4) ^ 0x0f);
は、少しわかりにくいですが、もっとわかりやすく分解すると以下のような処理をしています。
コード: [Select]
uint8_t pin_values = PINB;  // PINB レジスタからピン情報を読む。4, 5, 6, 7 ビット目にキー情報が入っている。
                            // 例えば lowC キーが押された場合、この時点で pin_values は 0xe0 (16進数) あるいは 11100000 (2進数)

pin_values = (pin_values >> 4);  // 4ビット右にシフトして 4, 5, 6, 7 ビット目を 0, 1, 2, 3 ビット目に移動する。 4, 5, 6, 7 ビット目には 0 が入る
                                 // 例えば lowC の場合この時点で pin_values は 0x0e (16進数) あるいは 00001110 (2進数)

key = pin_values ^ 0x0f;  // 0x0f は二進数であらわすと 00001111。  ^ は xor 演算子で 1111 を掛け合わせると入力ビットが反転する。
                          // 例えば、lowC の入力値はこの段階で 00001110 で、00001111 と掛け合わせると 00000001 になる。(0xe -> 0x1)

この辺りがキー入力のコードを読んだり改造したりするために重要な部分です。長くなってしまったので、改造についてのご質問への答えは別の投稿に書きます。
62
製作上のご質問 / Re:ミニ鍵盤で2オクターブ発生させたい
« 最新の投稿 by fukuryu 投稿日: 2月 06, 2019, 06:23:11 pm »
返信ありがとうございます。
ライセンスの件は了承しました。

あれからまたいろいろやってみて、現在高い「ソ」まで同時に出せるようになりました。
この調子で2オクターブ同時に出して、一体型にできそうです。
ピッチベンドの機能は個人的になくてもよいと思ったのでそのピンを使って5本のピンで試しにやっています。
そのほうがやりやすかったので、
ダイオードは安価ですので数は増えますが、なんとかなります。
プログラムもはじめてだったのですが、右シフトなどとても勉強になります。
一体型にしている他の製作者は少ないようですし、完成したら写真をあげようと思います。
63
製作上のご質問 / Re:ミニ鍵盤で2オクターブ発生させたい
« 最新の投稿 by Gan 投稿日: 2月 02, 2019, 04:19:23 am »
hyokure さん
一体型良いですよね。作るの大変ですけれどもつまみいっぱいのキーボードはやっぱりわくわくします

プログラムの改変は自由に行ってください。Analog2.0 のリソースは、MiniBoard のソースコードも含めて以下のサイトでGPLv3 というライセンスで公開しています。
https://github.com/naokiiwakami/analog2.0

GPL の概要は以下のリンクでの解説がわかりやすいと思います。
http://easylabo.com/2015/04/rapid-prototyping/9045/
改変自由、再公開自由、商用利用自由のライセンスですが、改変したソフトを配布する時には必ずソースコードを公開して同じく GPLv3 のライセンスで行ってください。

2オクターブ分出したいということは、キーボードが2オクターブ分 25キーあるということですよね?それですと、今の回路の延長ではダイオードの数が増えすぎて少し大変かもしれません。(今の MiniBoard の回路の設計は実は少し考えが足りなかったと後悔している部分です)鍵盤数が多い時にはキーボードマトリクスという回路を使うとマイコンの少ないピン数で読み取りができて良いです。以下のリンクの解説などがわかりやすいです
http://miqn.net/periph/48.html
https://www.ei.fukui-nct.ac.jp/~t-saitoh/exp/h8/key-matrix.html

書籍では MiniBoard のプログラムや回路の解説をまるまる省いてしまったのでちょっとわかりにくいですね。少し整理してからまた投稿します。少しお待ちください
64
製作上のご質問 / ミニ鍵盤で2オクターブ発生させたい
« 最新の投稿 by fukuryu 投稿日: 2月 01, 2019, 01:51:56 am »
お疲れさまです。

見た目の問題とmidi鍵盤を接続すればいいことなのですが、analog2.0をkorgのMS-20 miniのように、
鍵盤と一体型にしたいと思いました。midi鍵盤を内部でつないであとは木で枠でもつければいいと思いつつ、
まず最近はmidi鍵盤がほとんどusb-midiになってしまいサイズの問題からもちょうどいいものがみつかりませんでした。
仕方がないのでusb-midi鍵盤を用意して、midiは使わずcv発生器のスイッチのところを鍵盤につないでいきました。
1オクターブ分のところまでは上手くいったのですが、2オクターブを同時にだすのはどうやらこれはatttiny2313の
プログラムを変えないといけないと気が付きました。

この掲示板では改造の話題もでていますが、プログラムは改造していいのでしょうか?
公開されているということは自由に変えていいのでしょうか?

まず、cv発生器では4つのピンからの信号で1オクターブを操作しているようなので、これを5つのピンで操作するように
しないといけないと思います。attiny2313の3ピンは使ってないようですのでこれを使えるでしょうか?
あとオクターブスイッチで変わるのは1オクターブですのでこれも2オクターブに変更しないといけません。
プログラムに関しても初心者ですが、みてみたところmidiのところは関係ないとしてとばして関係がありそうなのが、
 * iosetup()
 * Initializes I/O ports.
 */
void iosetup(void)
{
    /* setup output data port */
    DDRB = _BV(PB0) |  // tuning tone
           _BV(PB1) |  // gate out
           _BV(PB2) |  // note CV
           _BV(PB3);   // pitch bend

    PORTB = 0xf0; // key reader

    PORTD = _BV(PD2) | _BV(PD3) | _BV(PD4) | _BV(PD5) | _BV(PD6);
のところと、
// check the keyboard
    //
    octave = ((PIND >> 3) ^ 0x0f) * 12;
    key = ((PINB >> 4) ^ 0x0f);
のところかなと思いいろいろやってみましたが上手くいきません。

どうかよろしくお願いします。



65
製作上のご質問 / Re:鍵盤をはなしても音がする
« 最新の投稿 by fukuryu 投稿日: 12月 31, 2018, 03:26:19 pm »
ありがとうございます

いったん動いていたvcoやminiboard2が動作しなくなり試行錯誤していました
鍵盤をはなしても音がするのは、vcoのcvがgndに接触しているのが原因でした

いろいろなmidi機器を接続してみているのですが、midiも相性があるようで古いmidi機器は相性がよくないようですね
かなり古いものですが、rolandのmc-50やpc-160、yamahaのqy8はNGでした
korgのelectribe2やmininovaはOKでした
66
製作上のご質問 / Re:鍵盤をはなしても音がする
« 最新の投稿 by Gan 投稿日: 12月 24, 2018, 07:45:38 pm »
hyokure さん製作ありがとうございます。返事が遅くなってしまいすみません。

VCA の入力には mixer の出力を暫定的につないだままにしておいてください。
その状態で、p.173 の VCO まわりの結線図にあるように、VCO の出力をmixer の JP1 入力につないでみてください。つながりは p.104 の Mixer の結線図もみていただくと良いと思います。
その状態で mixer の一番上のボリュームを上げるとVCO からの波形が mixer から出るようになります。暫定的につないだ VCA の Initial のレベルを上げて出力から音が出れば期待された動作です。
本書のVCOの節のパネル図には、鍵盤を下ろした時に音が止まるための結線が書かれていませんけれども、ゲート出力を VCA の CV に入れると on/off できると思います。
本書では、音の on/off をエンベロープジェネレータで行うか gate 信号で行うか切り替えるような結線になっています。p.141 の VCA の結線図の SW1、JP1 あたりを参考にしてみてください。
67
製作上のご質問 / 鍵盤をはなしても音がする
« 最新の投稿 by fukuryu 投稿日: 12月 20, 2018, 01:50:02 am »
改訂版の書籍を購入して製作しています
一応vcoの調整のところまできて、miniboard2を使ってmidi鍵盤でひいてみようとしました
鍵盤の通り音はでるのですが、鍵盤から手をはなしているときもブーと音がします

miniboard2の基準音はでていますし、cv gateも正しくでています

vcoの動作確認のところでvca出力からの音の確認がありますが、前の章で暫定的につないだmixer出力は
そのままにして確認するのでしょうか?

書籍で「ドレミがひけた」というシーンがありますが、パネルはそのイラストのままでひけているのでしょうか?

現在vcaになにもつながないと音はでません よろしくお願いします
68
パーツについて / Re:温度補償用の抵抗
« 最新の投稿 by fukuryu 投稿日: 11月 16, 2018, 10:47:03 am »
ありがとうございます 1/6wのもので大丈夫なんですね
これで安心して使えます 心配しすぎでした
69
パーツについて / Re:温度補償用の抵抗
« 最新の投稿 by Gan 投稿日: 11月 15, 2018, 04:36:08 pm »
hyokure さんはじめまして。
1/6w で大丈夫です。この抵抗の両端には高くてもせいぜい 0.1-0.2V 程度の電圧しかかからないので(通常の使い方ではそんな高さにまでも行きません)、消費する電力も 1/1000W にも満たないものです。ご心配なく。
70
パーツについて / Re:温度補償用の抵抗
« 最新の投稿 by fukuryu 投稿日: 11月 14, 2018, 09:25:20 pm »
はじめまして 4年も前のスレッドにいきなり失礼します
1kΩ、3300ppm/℃の抵抗ですが、1/6wのものでも使えるのでしょうか?
vco基板のほかの抵抗は1/4wだったので少し気になり質問してみました
ネット上で見つかったものが1/6wだったもので
よろしくお願いします
ページ: 1 ... 5 6 [7] 8 9 10