製作モジュール一覧

ラベル SQ-1 の投稿を表示しています。 すべての投稿を表示
ラベル SQ-1 の投稿を表示しています。 すべての投稿を表示

2021年7月25日日曜日

Korg SQ-1のGate信号を拡張 GateEXの製作(2)

試作したGateEXは、Korg SQ-1とつないで自作のKIK01にSync信号を送ると、SQ-1のSync信号が疎で特にハットの刻みが少なくイマイチでした。Sync信号の周期を分割してもっと細かくGate信号を送出できるように改良しました。


SQ-1から送られてくるSync信号の間隔を測定し、分割数で割った間隔でタイマ割り込みをかけ、Gate信号を送出するという動作にしました。

ハードウェアの変更は行わず、変更はファームウェアのみです。Gateタイムを設定していたPOTで、分割数を設定するように変更しました。自作のKIK01は信号の立ち上がりしか見ていないのでGateタイムはSQ-1のSync信号と同じく15msに固定しました。

Gateオフのタイミングと分割したGate出力のタイミングを同じMsTimer2でとっています。Gateオフ時に次のGate信号のTimer割り込みを設定しており、図のようにタイマ割り込みまでの待ち時間はInterval - PULSE_WIDTH[ms]となります。

1回目のGate信号送出はSync信号のハードウェア割り込み時となるため、MsTimer2によるタイマ割り込みは2回め以降になります。「1/1」の場合はタイマ割り込みは行われません。

また、前回のファームウェアではDIPスイッチとシーケンスの割当が逆順になっていました。本来は左から右へ再生されるべきが、右から左の順になっていました。意外とわからないものですw

Arduinoのスケッチ <Gate_Sequencer_02.ino>

//
// Gate Sequencer
//   Sync-in -> Gate sequence
//   Split Sync-in
//
// 2021.07.25
//

#include <MsTimer2.h>

#define PIN_SYNC_IN      (2)
#define PIN_GATE_OUT     (12)
#define PIN_GATE_LED     (11)
#define PIN_DIVISION     (A0)

#define CNT_N            (8)
#define PULSE_WIDTH      (15)

byte sequence[CNT_N] = {0};
int cnt = 0;
int division = 1;
int divisionCnt = 0;
int interval = 0;

void gateOff()
{
  digitalWrite(PIN_GATE_OUT, LOW);
  digitalWrite(PIN_GATE_LED, LOW);

  if (divisionCnt > 0) {
    divisionCnt--;
    MsTimer2::set(interval - PULSE_WIDTH, stepOne);
    MsTimer2::start();
  }
}

void stepOne()
{
  digitalWrite(PIN_GATE_OUT, sequence[cnt]);
  digitalWrite(PIN_GATE_LED, sequence[cnt]);

  cnt++;
  if (cnt >= CNT_N) {
    cnt = 0;
  }

  MsTimer2::set(PULSE_WIDTH, gateOff);
  MsTimer2::start();
}

void step()
{
  static uint32_t prevTime = 0;
  
  uint32_t now = millis();
  interval = (now - prevTime) / division;
  prevTime = now;
  divisionCnt = division;

  stepOne();
  divisionCnt--;
}

void setup() {
  pinMode(PIN_SYNC_IN, INPUT);
  pinMode(PIN_GATE_OUT, OUTPUT);
  pinMode(PIN_GATE_LED, OUTPUT);

  // DIP switch
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(PIN_SYNC_IN), step, RISING);
}

void loop() {
  // Read DIP switch
  sequence[0] = !digitalRead(10);
  sequence[1] = !digitalRead(9);
  sequence[2] = !digitalRead(8);
  sequence[3] = !digitalRead(7);
  sequence[4] = !digitalRead(6);
  sequence[5] = !digitalRead(5);
  sequence[6] = !digitalRead(4);
  sequence[7] = !digitalRead(3);

  // Read division
  division = analogRead(PIN_DIVISION) / 256 + 1;  // 1 ~ 4
}

入出力波形

ch1:Sync-in ch2:Gate-out

SQ-1のSpeedを最速にし、GateExのDivisionを1/4に設定。

メモ


オシロで出力波形を観測すると、ジッターというか波形の間隔が揺れることがあります。millis()ではなくmicros()関数、MsTimer2ではなくTimer1を使うようにして(us単位で制御できる)分解能を上げると改善するかもしれません。

ハードウェアを改修するなら、押すとシーケンスの頭から再生し直す(シーケンス・リセット)ボタンがあると良さそうです。SQ-1のシーケンスとは1音単位では同期していますが、フレーズとしてはズレてしまいます。SQ-1側のスタート/ストップで一応は対応できます。

2021年5月24日月曜日

Korg SQ-1のGate信号を拡張 GateEXの製作

Korg SQ-1のGate出力は2系統しかありません。自作のリズムマシンのKIK01と同期するためにGate信号を増やすモジュールを作りました。

ブロック図

SQ-1はSync信号が出ていますので、これを間引いてKIK01に入力するGate信号とします。シーケンスパターンの設定は簡単に8PのDIPスイッチで行います。ボタンを並べたりちゃんとしたユーザーインターフェースを作るのは骨の折れる仕事ですし、自作するよりもう1台SQ-1を購入して同期させたほうが安く済むかもしれません。

コントローラーとしてArduino Pro Miniを2個使用しました。

SQ-1のSync信号は5Vですが、Gate信号は10Vですので、間違ってSQ-1のGate出力をつないでも大丈夫なように入力に保護回路を入れています。

電源はArduino Pro Miniにもリニアレギュレータが載っていますが、あまり性能が良くないので別途7805を使った5V電源を載せています

回路図

外観

ケースはタカチPB-2です。最近このケースのサイズのバリエーションが増えたようですね。

背面の穴あけを左右逆に間違えてしまって、背面のパーツの配置は間に合わせです。

Korg SQ-1と接続

9V電源で、電源電流は35mA~38mA程度です。

Arduinoのスケッチ GateSequncer_01


//
// Gate Sequencer
//   Sync-in -> Gate sequence
//
// 2021.04.27
//

#include <MsTimer2.h>

#define PIN_SYNC_IN      (2)
#define PIN_GATE_OUT     (12)
#define PIN_GATE_LED     (11)
#define PIN_PULSE_WIDTH  (A0)

#define CNT_N            (8)

byte sequence[CNT_N] = {0};
int cnt = 0;
int pulseWidth = 20;

void gateOff()
{
  digitalWrite(PIN_GATE_OUT, LOW);
  digitalWrite(PIN_GATE_LED, LOW);
}

void step()
{
  digitalWrite(PIN_GATE_OUT, sequence[cnt]);
  digitalWrite(PIN_GATE_LED, sequence[cnt]);

  cnt++;
  if (cnt >= CNT_N) {
    cnt = 0;
  }

  MsTimer2::set(pulseWidth, gateOff);
  MsTimer2::start();
}

void setup() {
  pinMode(PIN_SYNC_IN, INPUT);
  pinMode(PIN_GATE_OUT, OUTPUT);
  pinMode(PIN_GATE_LED, OUTPUT);

  // DIP switch
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(PIN_SYNC_IN), step, RISING);
}

void loop() {
  // Read DIP switch
  sequence[0] = !digitalRead(3);
  sequence[1] = !digitalRead(4);
  sequence[2] = !digitalRead(5);
  sequence[3] = !digitalRead(6);
  sequence[4] = !digitalRead(7);
  sequence[5] = !digitalRead(8);
  sequence[6] = !digitalRead(9);
  sequence[7] = !digitalRead(10);

  // Read pulse width
  pulseWidth = analogRead(PIN_PULSE_WIDTH) / 10;  // 0~102 ms
}

Sync信号の受信はハードウェア割り込みで行っています。出力Gate信号をオフにするタイミングを取るためにMsTimer2を利用しています。

Arduinoには2枚とも同じスケッチを書き込みます。

出力例

C1:Gate1 C2:Gate2

メモ:


電源の入れ方によって、2枚のArduinoのシーケンスの開始がずれる場合があります。RSTボタンを押して同時にリセットをかけると同期します。起動時に同期させる仕組みを入れたほうが良いと思います。

2021年4月21日水曜日

Korg SQ-1 ファーストインプレッション

ステップシーケンサーのKORG SQ-1を購入しました。アナログシンセを使っている人にはコスパが良く、そうでない人にはほとんど使いみちが無い機械です。

今まではDAWのMIDI機能とMIDI-CVコンバーターを使ってシーケンサーとして使っていました。変わった点は、マウス操作ではなくつまみをひねって音を操作出来るようになり、PCも特に必要ではなくなりました。つまみをひねれば音色が変化するアナログシンセとの親和性は非常に高いと言えます。


同梱物は、マニュアル、MIDI-OUT端子変換ケーブル、単3電池×2でした。電源は電池の他USBから供給可能です。

出力信号の観測



出力信号 CV & GATE

CVは5V設定です。設定により、1V、2V、5V、8V(Hz/V)に変更可能です。

GATE信号はH=13V程度出ています。

出力信号 SYNC

SYNC信号はH=5V出力です。パルス幅は13.5msです(仕様では15ms)。正負の極性は設定により変更可能です。

GATE信号の取り扱い


GATE信号は仕様では10Vとなっていますが、無負荷で測定すると13V程度出ています。

自作のEGはGATE信号をArduinoのGPIOに入力する仕様となっているため、H=5Vに制限するようにアダプタを製作しました。


単に10kΩの抵抗をかましただけですが、EG側の入力インピーダンスと合わせてH=5Vとなりました。

またSQ-1のGATE信号の出力インピーダンス(内部抵抗)を計測しようと100Ωの負荷抵抗をつないで出力電圧を計測しましたが、無負荷時と比較してほとんど電圧降下が見られませんでした。出力インピーダンスは無視してかまわないと思います。負荷抵抗100Ωの場合
IO = VO / RL = 13V / 100Ω = 130mA
となり、これ以上流すと危険なので深追いはしていません。おそらく短絡しても保護がかかるようになっているとは思いますが。

SLIDE機能


ステップ間の音程をなめらかにつなぐ機能です。SLIDEをONにしたステップと次のステップが補間されます。


SLIDEをONにしたステップから次のステップにかけてCVがなだらかに補間されています。また、SLIDEをONにしたステップのGATE信号はLに戻らず、次のステップまでHのままになっています。少し凸凹していますが、GATE信号は論理値なので問題ないでしょう。

またSEQUENCE MODE (ロータリースイッチ)でCV SLIDEモードを選択するとBチャンネルのプッシュボタンでSLIDE ON/OFF、ノブでカーブのゆるさを変更できます。

Bチャネルのノブ最大→カーブがゆるい

Bチャネルのノブ中間→カーブがシュッとする

音程やフィルターの開閉など、ちょっとしたニュアンスの表現に使えると思います。

メモ


マイコンなどデジタル回路を使ったモジュールを使う場合、GATE信号の13Vに耐えられる仕様にする必要があります。今まで私が作ったものは5V仕様なのでちょっとまずいですね。間違えてCVやAudio用のジャックにGATE信号を入れてしまうことも普通にありそうです。

何らかの保護回路を入れたり、ロジックICなら高耐圧の4000シリーズを使ったりでしょうか。今後の製作物の要件とします。

EGの電源をオフにした場合、入力電圧が低下。AVRは電源OFFの場合GPIOの入力インピーダンスが低くなる?