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拍目、余分なんじゃね……?」
こうだろ!こう!
続く。

One thought on “ArduinoでYMOクリックもどき”

コメントを残す