だいぶ前に買ったまま放置していたCdS(光センサ)の存在を思い出したので、PSGの回路で使ってみました。
1000個もいらん(汗
秋月電子では40円からあります。
5Vから10kΩ抵抗経由でGNDに落とす途中にアナログ入力の0番につなぎます。
こんな感じ。
スケッチはこちら。
#include <YMZ294.h>
// Output Pins
const byte WRCS_PIN = 8;
const byte A0_PIN = 9;
const byte RESET_PIN = 10;
YMZ294 ymz(WRCS_PIN, A0_PIN, RESET_PIN);
void setup() {
DDRD = 0b11111111;
pinMode(WRCS_PIN, OUTPUT);
pinMode(A0_PIN, OUTPUT);
pinMode(RESET_PIN, OUTPUT);
ymz.Reset();
ymz.SetMixer(0b111, 0b100);
ymz.SetVolume(CH_A, 0b00001111);
ymz.SetFreqBit(CH_A, 0);
ymz.SetVolume(CH_B, 0b00001111);
ymz.SetFreqBit(CH_B, 0);
}
word value;
void loop() {
value = 1024 - analogRead(0);
ymz.SetFreqBit(CH_A, value);
ymz.SetFreqBit(CH_B, value);
delay(10);
}
analogRead()で取ってきた値を音程として与えてます。
そのままYMZ294に食わせてもいいんですが、その場合、明るい方が低い音で暗い方が高い音になるので、逆のほうが面白そうだってことで1024 – analogRead(0)にしてます。
delay()は10ミリ秒。てきとーです。
ちなみに動画で使ってるのは自転車用のライト。一段階暗くした状態(17秒くらい)の音が、ファミコン版火の鳥で我王が死んだ時の音に似てる気がする。
もう一個。こちらは前回のリズムマシン風ノイズを操作してます。
回路は矩形波の方と同じ。
スケッチも前回とそう変わってないんですが、一応。
#include <YMZ294.h>
// Output Pins
const byte WRCS_PIN = 8;
const byte A0_PIN = 9;
const byte RESET_PIN = 10;
YMZ294 ymz(WRCS_PIN, A0_PIN, RESET_PIN);
void setup() {
DDRD = 0b11111111;
pinMode(WRCS_PIN, OUTPUT);
pinMode(A0_PIN, OUTPUT);
pinMode(RESET_PIN, OUTPUT);
ymz.Reset();
ymz.SetMixer(0b111, 0b000);
ymz.SetVolume(CH_A, 0b00001111);
ymz.SetFreqBit(CH_A, 0);
ymz.SetVolume(CH_B, 0b00001111);
ymz.SetFreqBit(CH_B, 0);
ymz.SetVolume(CH_C, 0b00001111);
ymz.SetFreqBit(CH_C, 0);
}
byte beats[6][2] = {
{0b00100, 8},
{0b00001, 12},
{0b00010, 8},
{0b01000, 64},
{0b00010, 8},
{0b00010, 16},
};
void loop() {
static word noteGate = 192;
static unsigned long lastMSec = 0;
static byte state = 0;
static byte step = 0;
unsigned long diffMSec = millis() - lastMSec;
noteGate = 256 - (analogRead(0) >> 2);
switch (state){
case 0: // Note Off to On
ymz.SetNoiseFreqBit(beats[step][0]);
TurnNoise(true);
state = 1;
break;
case 1: // Step Time Over
if (diffMSec > beats[step][1]){
TurnNoise(false);
state = 2;
}
break;
case 2: // Gate Time Over (Note Off)
if (diffMSec > noteGate){
state = 0; // Initialize
lastMSec = millis();
if (++step >= (sizeof(beats) / 2))
step = 0;
}
break;
}
}
void TurnNoise(bool isNoise){
if (isNoise)
ymz.SetMixer(0b000, 0b000);
else
ymz.SetMixer(0b111, 0b000);
}
こちらは周波数として与えてもあんまりおもしろくないので、半固定抵抗の時と同様、テンポを変えるのにCdSを使ってます。
明るい→テンポ早め、暗い→テンポ遅めにするために、noteGate = 256 – (analogRead(0) >> 2)としてます。
さて、こいつを応用すれば、なんかもっとおもしろい事ができそうな気がするんですが、ちょっとまだ思いつかないのでとりあえずここまで。また明日にでも考えます。