Deckadance2」カテゴリーアーカイブ

Deckadance2開発終了?

久しぶりにGibsonのDeckadance2フォーラムを見に行ってみたところ、2019/9/30付けで開発者のLuis Serrano氏が「会社の再建により、もうDeckadance2やStanton製品の開発を行うことはない」旨の書き込みをしていました。

Deckadanceは元々Image-Line社の製品でしたが、権利が米Stantonに売却されて開発が継続されているところでした。開発者もそのまま移籍していたのですが、残念な結果になってしまいました。

もっとも、Stantonの親会社であるGibson社はLuis氏が書き込んでいるとおり連邦破産法の申請をして会社再建中ですし、Deckadanceも個性的ではありましたが大手のTraktorなどに比べるとやはり見劣りする感じは否めなかったので、この結果も仕方ないことかもしれません。

米Gibsonの経営悪化

ギターメーカーのGibson社の経営が悪化しているとの報道がここ数日伝わってきています。

私はギターは一切演奏できないのですが、なぜこのニュースが気になるかというと、現在Gibson社はStantonブランドとDeckadance2を抱えているからです。

ニュースによると今後債務の借り換えなど手を打っていくらしいのですが、経営再建の過程でDJ関連製品は他社に売却または販売終了といった事態もありうるのではないかと心配をしています。

DD2は2017年の6月に2.73betaが出て、その後も2.73完成版のリリースに向けて細々と作業が進んでいるようです。

Launchpad用スクリプトでビート表示

dd_commands.hを眺めていたら、昔のバージョンにあったビート表示をするための命令が残っていたので、スクリプトに組み込んでみました。

アニメーションgifになっています。最下段の1・3・5・7個目のパッドがデッキA、2・4・6・8個目のパッドがデッキBのビートを表示します。

この部分のコードは

 

void OnTimerCallback()
{
 int PinkLow = 0x37;
 int PinkHigh = 0x35;
 int SkyblueLow = 0x27;
 int SkyblueHigh = 0x25;

 (get(BEAT_ID_A) == 1) ? sendMidiMessage(0x90, 0xB, SkyblueHigh) : sendMidiMessage(0x90, 0xB, SkyblueLow);
 (get(BEAT_ID_B) == 1) ? sendMidiMessage(0x90, 0xC, PinkHigh) : sendMidiMessage(0x90, 0xC, PinkLow);
 (get(BEAT_ID_A) == 2) ? sendMidiMessage(0x90, 0xD, SkyblueHigh) : sendMidiMessage(0x90, 0xD, SkyblueLow);
 (get(BEAT_ID_B) == 2) ? sendMidiMessage(0x90, 0xE, PinkHigh) : sendMidiMessage(0x90, 0xE, PinkLow);
 (get(BEAT_ID_A) == 3) ? sendMidiMessage(0x90, 0xF, SkyblueHigh) : sendMidiMessage(0x90, 0xF, SkyblueLow);
 (get(BEAT_ID_B) == 3) ? sendMidiMessage(0x90, 0x10, PinkHigh) : sendMidiMessage(0x90, 0x10, PinkLow);
 (get(BEAT_ID_A) == 4) ? sendMidiMessage(0x90, 0x11, SkyblueHigh) : sendMidiMessage(0x90, 0x11, SkyblueLow);
 (get(BEAT_ID_B) == 4) ? sendMidiMessage(0x90, 0x12, PinkHigh) : sendMidiMessage(0x90, 0x12, PinkLow);

 return;
}

こんな感じになっています。OnTimerCallback内で実行しているので50ミリ秒ごとに実行されます。そのため視覚的にずれを感じることもありません。

ある程度慣れているとピッチ合わせにこういった表示は必要なくなってきますが、一種のドレスアップ要素としては賑やかで楽しいと思います。

 

Launchpad MK2の色変更

Deckadance2用にスクリプトを書いて使用しているNovationのLaunchpad MK2ですが、スクリプトが元々初代Launchpad用だったため、赤・黄・緑・オレンジの4色で表示をするようになっていました。

MK2は様々な色が使えるようになっているため、スクリプトを一部書き換えました。

私の感覚によるところなので美しいものではないかもしれませんが、HSVのグラデーションに従い、下から上に色合いが変化するようにしてみたつもりです。ほぼ色ごとに機能の割り付けができているので、操作感も良くなりました。

全体的に彩度が低く映っているような感じに思えますが、これはスクリプトで「押してないときは暗めに発光、押すと明るく発光」という制御をしているからです。操作をすると対応して光ります。

Launchpad MKIIのプログラマ用マニュアル

Deckadance2用のMIDIスクリプトを書いていると、どうしてもハードウェアの仕様に関する情報が必要になる場合があります。

具体的には、

  • どの操作をするとどういう内容のMIDIメッセージが送出されるか
  • コントローラに内蔵されているLEDの制御

この2点の情報が必要になります。前者はDAW等でMIDI信号を受け取って1個1個検証して行っても良いのですが、これは非常に面倒です。後者は何かしらの情報がないと全く制御ができません。

novationはWebでこういう場合のために、”Launchpad MK2 Programmer’s Reference Manual”というPDFのマニュアルを公開してくれています。先方のリンクに対するポリシーがよく分からないので直接リンクは張りませんが、検索するとすぐ見つかります。

読むとAbleton Live前提で書かれているような感じはしますが、「LEDを点滅させたい場合どうするか」や「グリッドを列単位で発光させたい場合どうするか」等、具体例を示して説明されています。

Deckadance2用のスクリプトを書くにあたっては、MIDIメッセージと各グリッドの対応、MIDIメッセージとLED色の対応を調べる時に参考になりました。

 

DD2のMIDIスクリプトファイルでのピッチ変更

春に買ったLaunchpad MK2用のスクリプトは割りとすぐに”ほぼできあがり”の状態にまで持っていけたのですが、最後に難題として残ったのがピッチ変更をどのように実現するかという問題でした。

元々入っているLaunchpad S用のスクリプトのピッチ変更部分のコードが流用できると思っていたのですが、どうもうまく動かなかったのです。setとgetを使ってデッキのピッチ値を変更するだけのコードだったのですが、なぜうまく動かないのかは今もって謎です。

結局、他のコントローラ用のスクリプトなども参考にして、ピッチ変更用の配列を作って、スイッチが押されるたびに添え字を増減させてピッチ設定をするコードを書きました。

//PitchA array subscript
int pary_A = 5;

//Pitcharray
array<float> midiPitchTable = {
0.1,
0.2,
0.3,
0.4,
0.5,
0.6,
0.7,
0.8,
0.9,
1.0
};

//DeckA pitch change down
case 0x51:
if(value > 0 && pary_A < 0) pary_A = 0;
if(value > 0 && pary_A > 0) pary_A = pary_A - 1;
if(value > 0) set(PITCH_A, 1.0 - midiPitchTable[pary_A]);

例としてデッキAのピッチを下げる処理を簡略化して書いてみました。

事前に0.1-1.0の10段の配列を用意しておいて、ボタンが操作されると配列の添字を1減らします。結果、ピッチが下がるというわけです。例では10段しか変えられないですが、実際には実用的な上下限と実用的な変動幅が必要になります。

case 0x51というのはLaunchpad側から送られてくるMIDIメッセージです。「どのボタンが押された時にこの処理をするか」という部分です。

配列に正の値しかないのでピッチがマイナスにならないように思うのですが、Deckadance2のスクリプト上ではピッチ0というのがピッチ下限を指し、ピッチ1というのはピッチ上限を指します。

配列によってピッチ変更の上下限と変更幅が決まってしまうので、これはお好みの値を考えないといけません。自分しか使わないので、自分用に都合良く作ってしまおうと思っています。

Deckadance2のMIDIスクリプトファイルを書く(4)

各コールバック関数の役割

Deckadance2のスクリプトにはコールバック関数という関数が4種類用意されており、どの関数の中に記述をするかでスクリプトが機能する条件が変わります。

コールバック関数とは何かと言われると不勉強で正確に説明はできないのですが、【イベントの発生と処理を分離するために使う関数】なのだそうです。Deckadance2のスクリプトは様々な状況に応じて処理を行うので、スクリプトを記述する際に便利になっています。

すべての処理に共通して言えることですが、コールバック関数の中に処理をそのままポンと書いてしまうと無条件で実行されるので、if文などの条件を評価する部分を追加して記述します。

void OnMidiMessageReceived (const string &in name, int status, int data, int value)

この中に処理を書くと何らかのMIDIメッセージを受信した時に実行されます。スクリプトの中でも主力のコールバック関数です。

void OnTimerCallback()

この中に処理を書くと50ミリ秒ごとに自動的に実行されます。コントローラの状況に応じてボタンを光らせる処理などを書くのに使います。

void OnStart()

この中に処理を書くとスクリプト開始時に実行されます。起動時にボタンを光らせる時なんかに使うといいかもしれません。

void OnStop()

この中に処理を書くとスクリプト終了時に実行されます。終了時にボタンを消灯する時なんかに使うといいかもしれません。

 

Deckadance2のMIDIスクリプトファイルを書く(3)

dd_commands.hで定義されているコマンド

インストールフォルダにある dd_commands.h というファイルが、スクリプト内で使うコマンド(=Deckadance2に発行できる命令)を定義しているファイルです。MIDIメッセージを受信した時にDeckadance2で何らかの処理を行う場合に、このファイルの中身を使います。

テキストエディタで開くと、使用できる命令が縦にずらっと並んでいます。コメント部に使い方が書いてあります。実際に使う場合は

set(hogehoge)

または

get(hogehoge)

のように、setかgetをつけて使います。setをつけた時とgetをつけた時の振る舞いの違いも、コメントに書いてあります。

dd_commands.hの最初に出てくる、PLAY_PAUSE_Aを例に挙げて説明すると

set(PLAY_PAUSE_A) :デッキAを再生または停止状態にします。

get(PLAY_PAUSE_A) :デッキAの再生状態(再生しているか/停止しているか)を返します。

となります。後はMIDIメッセージの受信とこれらのコマンドを組み合わせればスクリプトを作っていけます。

 

Deckadance2のMIDIスクリプトファイルを書く(2)

その2です。

MIDIコントローラについて知っておく

MIDIの細かい仕様まで理解する必要はありませんが、MIDIコントローラを操作した場合、コンピュータにどういう信号が送出されているかは知っておく必要があります。

ほとんどのDJ用MIDIコントローラの場合、ボタンやノブを操作すると送出されるのは

  • ノート信号(いわゆる鍵盤を押した時に相当する信号)
  • コントロールチェンジ信号(汎用のパラメータ変更に使える信号)

です。手持ちのコントローラのどの部分を操作するとどういう信号が出るのか、ということは事前にチェックしておかなくてはなりません。コントローラの取扱説明書に書いてある場合もありますが、情報がない場合は自分で実際に調べてみるのが早いです。

MIDIコントローラの信号を調べる

実際の調べ方です。

  1. コントローラを接続した上でPreferencesのMIDI Controlを開きます。
  2. 対象になるコントローラの”Input”をオンにします。
  3. 上段のController欄にある”MIDI Learn Editor”を開きます。

これは、従来のDeckadanceにもついていたキーアサイン用の機能です。使い勝手も大体一緒です。ポイントは、キーアサインの結果をスクリプトとして出力できるということです。つまり、調べたいボタンやノブに何か適当な機能を割りつけた状態でスクリプトを出力すると、そのスクリプトに信号の中身が出力されているというわけです。具体的には

  1. どれか適当な機能をダブルクリックします。
  2. MIDIコントローラの信号を調べたいボタンなどを押します。
  3. ボタンに機能が割り付けられるので、”Export Script”でスクリプトファイルを出力します。

ファイルを開いてみると、ノート情報であればこういう記述の行が見つかると思います。

【例】

if(status == 0x90 && data == 0x12) {
set(hogehoge, isDown);
return;
}

強調しましたがdata==0x12のところが重要です。これはノート信号の例ですが、0x12の信号を受信した時に何らかの処理を行う、という内容になっています。

勘の良い方はここまで見ると何となく分かってしまうのではないかと思いますが、信号の種類分こういったif文を用意すれば自作のスクリプトが作れます。

Launchpadなんかはボタンだらけなので調べるのに根気が要りましたが、こんな要領で全ボタンからどんな信号が出るかを調べました。

 

 

Deckadance2のMIDIスクリプトファイルを書く

Deckadance2のMIDIスクリプトの概要

Deckadance2(以下DD2と省略)でMIDIコントローラからの操作を行う場合、必ずMIDIスクリプトというファイルが必要になります。

MIDIスクリプトはコントローラから受け取ったMIDI信号をDD2側の操作命令に変換する働きをします。そのため、コントローラごとにMIDIスクリプトは異なるものになります。

MIDIスクリプトはAngelScriptというC++に近いスクリプト言語で書かれており、多少でもプログラムの心得があれば、サポートされていないコントローラをDD2対応にしたり、または既存のスクリプトを改造して使い勝手をよくしたりできます。

MIDIスクリプトのチュートリアルとサンプル

DD2のインストールフォルダに tutorial.txt というテキスト文書があり、これがチュートリアルです。ただし、それほど中身は細かく書かれているわけではありません。

同じくインストールフォルダにある dd_commands.h というファイルが、スクリプト内で使う列挙型を定義しているファイルです。各スクリプトではこのdd_commands.hを必ずincludeして使います。メモ帳やテキストエディタで開くことができます。

上記のファイルを見ただけではスクリプトを書くのは難しいと思うので、あわせて既存のMIDIスクリプトファイルを見ておくと良いと思います。公式なものからユーザーメイドのものまで色々あるので、人によってどの機能をどういう風に実装しているか個性が出ていて、参考になります。

 

Launchpad MK2用の自作スクリプトが大体できたので、DD2のMIDIスクリプトファイルの書き方をまとめてみることにしました。

「C++ベースのスクリプトだからわかりやすいぞ」ということなのですが、そのC++がほとんど分からないので苦戦しました。C関係については、はるか昔に”学生のためのC”という本で勉強を試みたのですが、例外にもれずポインタのことがよく分からなくて勉強するのをやめたことが悔やまれます。