2014年04月26日

ArduinoでPC98起動音

Arduinoが楽しすぎる。

(とっくにご存知の方も多いでしょうが)これが何なのかというと、マイコンを使った電子工作がスゲー楽に楽しくなる装置です。値段は概ね3,000円くらい。
で、とりあえずブレッドボードとタクトスイッチと10kΩ抵抗とジャンパワイヤ、スピーカーを用意して作ったのがこれ。

自分で言うのもアレですが、この動画音ちっさ過ぎ。

つくりかた。
こんな感じでつなぎます。
ArduinoでPC98起動音(写真) ArduinoでPC98起動音(回路図)
字が下手とか直線が引けてないとかは私も知ってるので。
※回路図のスピーカーのつなぎ方が極性逆ですねこれ、鳴ることは鳴るけど
スピーカーを10番ピンとGNDに直結してます。音がデカいようなら間に抵抗をかましてください。壊れやしないとは思いますが。

Arduinoの公式サイトから開発環境をダウンロードしてきてインストール。
そいつを起動してプログラムを書きます。Windows/Mac/Linux対応だそうですが、私はWindows7でしか試してません。
プログラミング言語はC/C++っぽい感です。日本語のリファレンスはこちらのサイトで。
PC98起動音を鳴らすプログラムはこんな。

// Input Pin
const int BUTTON_IN = 2;

// Output Pin
const int SOUND_OUT = 10;
const int LED_OUT = 13;

// Hz
#define NOTE_C6  1047
#define NOTE_C7  2093

void setup() {
  pinMode(BUTTON_IN, INPUT);
  pinMode(SOUND_OUT, OUTPUT);
  pinMode(LED_OUT, OUTPUT);

  pipo(100);
}

void loop() {
  if (digitalRead(BUTTON_IN) == HIGH){
    pipo(100);
  }
}

void pipo(int duration)
{
  snd(NOTE_C7, duration);
  snd(NOTE_C6, duration);
  delay(duration);
}

void snd(int hz, int dur)
{
  digitalWrite(LED_OUT, HIGH);
  tone(SOUND_OUT, hz, dur);
  delay(dur);
  digitalWrite(LED_OUT, LOW);
}

このプログラムをコンパイルして、USBケーブルをArduinoにつなげて転送します。

シンプルなものですが一応解説を入れると、
最初に一回だけ設定される関数setup()の中で

  • 2番ピンをボタン入力用に設定
  • 10番ピンをスピーカー出力に設定
  • 景気付けにpipo()を呼ぶ
実行中ずっとぐるぐる実行される関数loop()の中で
  • ボタンが押されているか確認
  • 押されていたらpipo()を呼ぶ
pipo()関数の中で
  • 押されていたら7オクターブ目のド(2093Hz)、6オクターブ目のド(1047Hz)を100ミリ秒ずつ鳴らす
ということをやっています。

さっき貼ったYouTubeの動画ではタクトスイッチを3つ用意してそれぞれ別の秒数を指定してますが、ここではまあシンプルに1つで。
あとなんかタクトスイッチが壊れて音が鳴りっぱなしになって、さっきの動画が再現できなくなっちゃったので。こんな単純なパーツどうやったら壊せるんだよ俺。
そんな雑なやつが使っても壊れないArduinoはすげえ。Arduino作った人もまさかこんなことで褒められるとは思ってなかっだろうな。

このピポって鳴らすやつは自分でも気に入ってるので、スピーカーを使うプログラムの時はだいたいsetup()関数の最後で使うようにしてます。
でもまあ、これだけじゃつまんないので次に作ったのがこんなの

これについてはまた後日。

タグ:Arduino YMO
posted by ImpactDrill at 14/04/26 22:32 | Comment(0) | TrackBack(0) | 電子部品

2014年04月27日

ArduinoでYMOクリックもどき

昨日の続きです。

まず、「YMOクリック」とはなんぞや、という話。
YMO、Yellow Magic Orchestraは、ライブの時にお互いの鳴らしている音をモニタースピーカーなどで確認しあって演奏する、というタイプのバンドではありませんでした。コンピュータ使って音出してるんだから当たり前の話ではあります。
全員ヘッドホンを装備して、ヘッドホンから流れる「キッコッコッコ、カッコッコッコ」という電子音、今で言えばチューナーにもついてる電子メトロノームのような音に合わせて演奏をしていたそうです。
で、そのYMOクリックと呼ばれる電子メトロノーム的な音というのがこれ。全体が見どころの塊のような動画ですが、YMOクリック自体は動画の終盤8:46あたりから。

私がYMOクリックを初めて聞いたのはこちらのMADですけど(4:44あたりから)

いいよね、唯クリック、いい……でも俺はどっちかというと律が。

いや、けいおん!は置いといて。
多分もうとっくに誰かYMOクリックのArduino版なんて作ってるだろうとは思いましたが、楽器の再発明もそれはそれで楽しいので作りました。楽器なのかこれ?
ArduinoでYMOクリックもどき
回路図と呼ぶのもおこがましいようなアレですが一応。

今回使うのは「半固定抵抗」というパーツでございます。エレキギターのVolume, Toneで使うポットを小さくしたようなものです。

どれをお使いになっても同じようなものです というか、ぶっちゃけスイッチサイエンス秋月電子で売ってる一番安いやつでいいです。
ギター用のポットが余ってたらそれでも可。ハンダ付けがめんどいので私は半固定抵抗とブレッドボードを使います。
半固定抵抗の抵抗値ですが、これも何Ωでも構いません。何Ωの抵抗を使っても、Arduinoのアナログ入力で0〜1023に変換されます
こいつを2個用意します。

半固定抵抗の左右のピンを5VとGNDにつなぎ、真ん中のピンをそれぞれANALOG INのA0とA1につなぎます。
A0につないだ方がテンポ調整、A1につないだ方が音程の調整です。
プログラムはこんなの。

// Analog pin setting
const int AIN_TEMPO = 0;
const int AIN_INTERVAL = 1;

// Output pin setting
const int SOUND_OUT = 10;
const int LED_OUT = 13;

// note
int note_length = 200;
int click_length = note_length / 4;
int note_hz = 440;

void setup() {
  pinMode(SOUND_OUT, OUTPUT);
  pinMode(LED_OUT, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  set_note();
  for (int i = 0; i < 8; i++){
    set_tempo();
    if (i == 0){
      snd(note_hz * 2, click_length);
    }else if (i == 4){
      snd(note_hz * 1.4, click_length);
    }else{
      snd(note_hz, click_length);
    }
    delay(note_length - click_length);
  }
}

void snd(int hz, int dur)
{
  digitalWrite(LED_OUT, HIGH);
  tone(SOUND_OUT, hz, dur);
  delay(dur);
  digitalWrite(LED_OUT, LOW);
}

void set_note()
{
  note_hz = (((analogRead(AIN_INTERVAL)) + 10) * 3);
}

void set_tempo()
{
  note_length = (analogRead(AIN_TEMPO) + 4);
  click_length = note_length / 4;
}

setup()の中は前回より減ってます。アナログ入力のピンはpinMode()で設定する必要が無いためです。
loop()の中身はこんな感じ

  • set_note()で音程を設定する
  • 「set_tempo()でテンポを設定して、設定された音を鳴らす。1拍目と5拍目はちょっと高い音程で鳴らす」というのを8回繰り返す

set_note()ではA0から読み込んだ値から音程を設定しています。設定してる内容は「なんとなく」で決めてます。
0Hzになっちゃうと当然聞こえないし、10kHzとか鳴らされても音と言うよりは高周波で頭痛がしそうなので、聞こえる音程に収まるよう、まあフィーリングで。

set_tempo()はA1から読み込んだ値からテンポを設定。これも早すぎず、遅すぎず、という感じで。+4してるのは、次の行で4で割ってるから。
なんで音符自体の長さ(note_length)と実際に鳴る音の長さ(click_length)を変えてるのかというと、これ空白空けずに全部鳴らすと「キッコッコッコ、カッコッコッコ」じゃなくて「ぴーぽーぽーぽーぱーぽーぽーぽー」になっちゃってカッコ悪いので。
跳ねる感じを出すために長さを1/4にしてます。それでもやっぱり「キッコッコッコ、カッコッコッコ」というよりは「ピポポポパポポポ」という感じですけども。

で、ここまで作ったところで動画撮影してYouTubeにアップロードして、音程上げたり下げたりテンポを異様に早くしたり、この回路とプログラムいじってるだけで2日くらいは遊べたんですが、なーんか物足りない。YMOってこうじゃねえよなあ。
「2拍目と6拍目、余分なんじゃね……?」

こうだろ!こう!
続く。

タグ:Arduino YMO
posted by ImpactDrill at 14/04/27 19:35 | Comment(0) | TrackBack(0) | 電子部品

2014年04月29日

Arduinoで雷電風リズムマシン

こないだの続きです。

今回の動画では、音声をライン入力で別録音→aviutlで映像と結合してx264出力にしたのと、aviutlの拡張編集を使って解説用の文字などを入れるという2点を変えてみました。どうでしょうかね。
今までは音声をヘチョいスピーカーから出して、それをiPhoneの内蔵マイクで録音、というハイテクなんだかローテクなんだかよくわからない録音の仕方をしていましたが、こういうものを作ってライン入力にしました。
cable.jpg
どなたさまのご家庭にでも必ずある……かどうかは分からないものの、安ギター収集のケがある人の家にはゴロゴロ転がっているギター用のシールドです。
こいつのプラグを片方ちょん切って、皮膜をむいて、ブレッドボード用の端子にハンダ付けしました。まさかこんなところで安ギター用品(と、ファミコンをテレビにつなげるためのスキル)が役に立つとは。
今までスピーカーをつなげていた代わりにこのケーブルをつなげて、そこからPCのLine Inに接続して録音しました。

回路はこんなです。
rydeen_circuit.jpg rydeen_photomain.jpg
デジタル入力とアナログ入力を別のブレッドボードに作りました。そろそろプロトタイプシールドとか買った方がいい気がしてきた。配線めんどい。

rydeen_photoL.jpg
左側のブレッドボード。なんだかややこしそうですが、やってることはシンプルです。
ここで新しく使ってるのはDIPスイッチというものです。

秋月で50円。動画見ると分かりますがスイッチが結構固いですこれ。
5V→スイッチ→デジタル入力のピン→10kΩ抵抗→GND という感じの接続を8個分。このスイッチひとつが8ビートのビート1つ分になります。

rydeen_photoR.jpg
右側のブレッドボード。半固定抵抗がひとつ増えています。フセン貼ったのは、自分でどの入力が何だったか分からなくなるので。3つ以上は「たくさん」です。
前回、音の長さを1/4とプログラム内で固定で計算してましたが、これを変えられるようにするためです。
どうでもいいんだけど、半固定抵抗ってカラーリングがコイツにすげえ似てる。

プログラム自体はそんなに変わってません。

// Analog pin setting
const int AIN_TEMPO = 0;
const int AIN_INTERVAL = 1;
const int AIN_LENGTH = 2;

// Digital pin setting
const int BEAT_COUNT = 8;
const int RHYTHM_1 = 2;
const int RHYTHM_2 = 3;
const int RHYTHM_3 = 4;
const int RHYTHM_4 = 5;
const int RHYTHM_5 = 6;
const int RHYTHM_6 = 7;
const int RHYTHM_7 = 8;
const int RHYTHM_8 = 9;
const int RHYTHM[BEAT_COUNT] = 
  {RHYTHM_1, RHYTHM_2, RHYTHM_3, RHYTHM_4, 
   RHYTHM_5, RHYTHM_6, RHYTHM_7, RHYTHM_8};

// Output pin setting
const int SOUND_OUT = 10;
const int LED_OUT = 13;

// note
int note_length = 200;
int click_length = note_length / 4;
int note_hz = 440;

void setup() {
  for (int i = 0; i < BEAT_COUNT; i++){
    pinMode(RHYTHM[i], INPUT);
  }

  // initialize the digital pin as an output.
  pinMode(SOUND_OUT, OUTPUT);
  pinMode(LED_OUT, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  set_note();
  for (int i = 0; i < BEAT_COUNT; i++){
    set_tempo();
    if (digitalRead(RHYTHM[i]) == HIGH){
      if (i == 0){
        snd(note_hz * 2, click_length);
      }else if (i == 4){
        snd(note_hz * 1.4, click_length);
      }else{
        snd(note_hz, click_length);
      }
      delay(note_length - click_length);
    }else{
      delay(note_length);
    }
  }
}

void snd(int hz, int dur)
{
  digitalWrite(LED_OUT, HIGH);
  tone(SOUND_OUT, hz, dur);
  delay(dur);
  digitalWrite(LED_OUT, LOW);
}

void set_note()
{
  note_hz = (((analogRead(AIN_INTERVAL)) + 10) * 3);
}

void set_tempo()
{
  note_length = (analogRead(AIN_TEMPO) + 4);
  click_length = note_length / ((analogRead(AIN_LENGTH) >> 5) + 1);
}
変わったところは、
  • スイッチの数(8個)分のデジタル入力ピンの定義と初期化
  • loop()内で、毎回必ず音を鳴らしていたのを、スイッチがONの拍だけ鳴らすように分岐を入れた
  • set_tempo()内で、click_lengthが1/4固定だったものを、アナログ入力ピン3によって変えられるように変更
この3ヶ所。3つ目はちょっと説明を入れます。
Arduinoのアナログ入力は0〜1023の1024通りの数値が入ってくるわけですが、それではちょっと細かすぎるので、>> 5という風に数を丸めています。
これはシフト演算子と呼ばれるもので、要するにここで書かれた回数だけ2でかけたり割ったりしてます。
ここでは>> 5だから、1024÷2÷2÷2÷2÷2で、0〜1023を、0〜31までという感じに荒くしてるってことです。
で、0だと困る(音を一旦鳴らしに行くと、そのまま帰ってこない)ので+1。やっつけです。
音程の方もうまく丸めればちゃんとしたドレミの音程が鳴るんですが、そこはまあキーボードとかでは鳴らないような妙な周波数の音が鳴った方が楽しいので、そのまんまです。

この回路とプログラムでめでたく雷電(らいでぃーん)のイントロっぽい音を奏でるリズムマシン(もどき)の完成でございます。

このままシンセっぽい音を作って、1チップYMOとかそういうのをやりたいところなのですが、Arduinoのtone()関数は一度にひとつの音しか鳴らせないという、如何ともし難い制限があるので、このチッチキチッチキをもってYMOっぽい音を鳴らすのはおしまいです。無念。
次は何作りましょうかね。

おまけ


最後のピッコロっぽいパートだけ鳴らしてみたりなんかして。

タグ:Arduino YMO
posted by ImpactDrill at 14/04/29 22:19 | Comment(0) | TrackBack(0) | 電子部品

2014年04月30日

Arduino+安エフェクターのコラボ

前回の動画をニコニコ動画にもアップしてみました。

コメント頂けると嬉しいです。

今回はちょっとした小ネタ。
せっかくギターのシールドに接続できるようになったんだから、Arduinoをギター扱いしてやろうと思いまして、前回おまけで貼った雷電の最後のピッコロっぽいパートを、

ベリンガーのエフェクターにつなげて録音してみました。
サウンドハウスへのリンクはこちら。サウンドハウスもカエレバ対応してくれたら楽なのになあ。いや、逆か。
BEHRINGER US600 Ultra Shifter/Harmonist BEHRINGER RV600 Reverb Machine


オーバードライブとかディストーションも試してみたんですけど、ギターとはまるで波形が違うのであんまり歪まなくておもしろくなかったんですよね。で、残ったのがこの飛び道具系エフェクター2台というわけでして。
コーラスやフェイザーも悪くないですが、ここまで劇的な効果ではありません。

人様のところからMML解読用のコードを借りてきて、ちょっと色つけた程度ですので、今回はプログラムはなしです。

posted by ImpactDrill at 14/04/30 22:57 | Comment(0) | TrackBack(0) | 楽器
×

この広告は90日以上新しい記事の投稿がない ブログに表示されております。