【M3】新作出します【4/27】

2014 4/27はM3!!
http://www.m3net.jp/

NKRN

今回もまたNKRNで新作出します!
タイトルは「CAPCORE vs NKRN」
ロゴからお察しの通りcapcom縛りのリミックス集となってます
ブースは第一展示場 2階 N-04a です!

全体の試聴:

自分の曲の試聴:

wH-Label

wH-Labelのとんでもない縛りのコンピに参加させていただきました!
FL Studioの 3xOSCのみで作られた曲 + FLのプロジェクトファイル付きのコンピレーションアルバムです。
こちらはN18aのwH-Labelブースで取り扱ってます

TripleX -LemonSquashExtra01-
全体の試聴:

自分の曲の視聴:

FLとSMFとpython (準備編)

FLで作った曲のBPMに合わせてごにょごにょする処理を自前で作りたくて色々試そうとしてます。

とりあえず思いついた方法が

  • FLで曲のwavとmidiを書き出す
  • wavとmidiをpythonのスクリプトで読み込んでごにょごにょ

というわけでまず準備編

1. FLでmidiを吐き出す

FLでこんなプロジェクトを用意

bpmtest.zip

fl-2014-04-13 21.37.29

2小節分のドラムループを4回ループ。3小節目からBPM変更のパターンが入って、5-6小節目中でBPMを140→54.013へ一気に下げる。

これのmidiを吐き出すには、まず

TOOLS > Macros > prepare for export

でmidiファイル出力に必要な適合化処理を実行する必要があります。

(これやらないと空のmidiファイルしか出来ない

で、こんなmidiファイルが出来る

bpmtest.mid

2. midiファイルをpythonのスクリプトで解析する

midiの解析にpython-midiを使う

https://github.com/vishnubob/python-midi

pipのindexに入ってるみたいですが、

自分の環境だとうまくインストールできなかったのでgitのREADME通りの手順でソースからインストール。

すると mididump.py というサンプルスクリプトも一緒にインストールされるので試してみる。

$ mididump.py ./bpmtest.mid | less
midi.Pattern(format=1, resolution=96, tracks=\
[midi.Track(\
  [midi.TimeSignatureEvent(tick=0, data=[4, 2, 24, 8]),
   midi.EndOfTrackEvent(tick=0, data=[])]),
 midi.Track(\
  [midi.SetTempoEvent(tick=0, data=[16, 243, 60]),
   midi.SetTempoEvent(tick=0, data=[6, 138, 27]),
   midi.SetTempoEvent(tick=768, data=[6, 138, 27]),
   midi.SetTempoEvent(tick=768, data=[6, 254, 136]),
   midi.SetTempoEvent(tick=24, data=[7, 111, 252]),
   midi.SetTempoEvent(tick=24, data=[7, 211, 193]),
   midi.SetTempoEvent(tick=24, data=[8, 14, 176]),
   midi.SetTempoEvent(tick=24, data=[8, 109, 233]),
   midi.SetTempoEvent(tick=24, data=[8, 190, 72]),
   midi.SetTempoEvent(tick=24, data=[9, 73, 112]),
   midi.SetTempoEvent(tick=24, data=[9, 215, 214]),
   midi.SetTempoEvent(tick=24, data=[10, 103, 106]),
   midi.SetTempoEvent(tick=24, data=[10, 226, 237]),
   midi.SetTempoEvent(tick=24, data=[11, 126, 229]),
   midi.SetTempoEvent(tick=24, data=[12, 22, 109]),
   midi.SetTempoEvent(tick=24, data=[12, 241, 204]),
   midi.SetTempoEvent(tick=24, data=[13, 208, 171]),
   midi.SetTempoEvent(tick=24, data=[14, 207, 174]),
   midi.SetTempoEvent(tick=24, data=[16, 30, 101]),
   midi.SetTempoEvent(tick=24, data=[16, 243, 60]),
   midi.EndOfTrackEvent(tick=0, data=[])]),
 midi.Track(\
  [midi.TrackNameEvent(tick=0, text='Sampler (MIDI)', data=[83, 97, 109, 112, 108, 101, 114, 32, 40, 77, 73, 68, 73, 41]),
   midi.ControlChangeEvent(tick=0, channel=0, data=[10, 64]),
   midi.ControlChangeEvent(tick=0, channel=0, data=[7, 100]),
   midi.PitchWheelEvent(tick=0, channel=0, data=[0, 64]),
:
:

これだけだとあんまり良くわからないので

こんなサイトを参考にhttp://www2s.biglobe.ne.jp/~yyagi/material/smfspec.html

以下引用

SMFの実際

テンポ120で、四分音符でドレ、全音符でミを鳴らすSMF。

ランニングステータスが多用されていることに注意。 また、ランニングステータスの効果を高めるために、 ノートオフとして 9n kk 00 (ベロシティゼロでノートオン) を使用している。

000000 4D 54 68 64 00 00 00 06 00 01 00 02 00 30 4D 54 / MThd………0MT

000010 72 6B 00 00 00 0B 00 FF 51 03 07 A1 20 00 FF 2F / rk……Q……/

000020 00 4D 54 72 6B 00 00 00 18 00 90 3C 7F 30 3C 00 / .MTrk…..・0.0>..@..0@…/

000040 00 / .

ヘッダ

4D 54 68 64 “MThd”

00 00 00 06 ブロック長(6)

00 01 フォーマット(1)

00 02 トラック数(2)

00 30 四分音符の分解能(0×30=48)

トラック1のデータ (Conductor Track)

4D 54 72 6B “MTrk”

00 00 00 0B ブロック長(0x0B=11)

00 FF 51 03 07 A1 20 テンポ(120)

00 FF 2F 00 トラックエンド

トラック2のデータ (演奏トラックその1)

4D 54 72 6B “MTrk”

00 00 00 18 ブロック長(0×18=24)

00 90 3C 7F ベロシティ127でノート3Cをノートオン

30 3C 00 48tick後、ノート3Cをノートオフ

00 3E 7F 直後に、ベロシティ127でノート3Eをノートオン

30 3E 00 48tick後、ノート3Eをノートオフ

00 40 7F 直後に、ベロシティ127でノート40をノートオン

81 40 40 00 192tick後、ノート40をノートオフ

00 FF 2F 00 トラックエンド

FF 51 03 tttttt : テンポ設定 (単位は μsec / MIDI 四分音符)

このイベントでテンポ変更を指示する。

tttttt (3byte) には、四分音符の長さをマイクロ秒 (μsec) で表したものを格納する。

例えば、BPM=120 (1分あたり四分音符が120個)の場合、 四分音符の長さは 60 x 106 / 120 = 500,000 (μsec)。 これを16進にすると0x07A120。従って、メタイベントは

FF 51 03 07 A1 20

となる。

/引用終わり

・・・ということなのでSetTempoEventの部分をみてみると

[midi.SetTempoEvent(tick=0, data=[16, 243, 60]),
midi.SetTempoEvent(tick=0, data=[6, 138, 27]),
midi.SetTempoEvent(tick=768, data=[6, 138, 27]),
midi.SetTempoEvent(tick=768, data=[6, 254, 136]),
midi.SetTempoEvent(tick=24, data=[7, 111, 252]),
midi.SetTempoEvent(tick=24, data=[7, 211, 193]),
midi.SetTempoEvent(tick=24, data=[8, 14, 176]),
midi.SetTempoEvent(tick=24, data=[8, 109, 233]),
midi.SetTempoEvent(tick=24, data=[8, 190, 72]),
midi.SetTempoEvent(tick=24, data=[9, 73, 112]),
midi.SetTempoEvent(tick=24, data=[9, 215, 214]),
midi.SetTempoEvent(tick=24, data=[10, 103, 106]),
midi.SetTempoEvent(tick=24, data=[10, 226, 237]),
midi.SetTempoEvent(tick=24, data=[11, 126, 229]),
midi.SetTempoEvent(tick=24, data=[12, 22, 109]),
midi.SetTempoEvent(tick=24, data=[12, 241, 204]),
midi.SetTempoEvent(tick=24, data=[13, 208, 171]),
midi.SetTempoEvent(tick=24, data=[14, 207, 174]),
midi.SetTempoEvent(tick=24, data=[16, 30, 101]),
midi.SetTempoEvent(tick=24, data=[16, 243, 60]),
midi.EndOfTrackEvent(tick=0, data=[])]),

BPMはdataの部分の数値を3byteの数値と見れば良い
data=[6, 138, 27]の場合は

27 + 256^1 * 138 + 256^2 * 6 = 428571(μsec)→4分音符の長さ
BPM = 60000000 / 428571 = 140.00014000014 ≒ 140

となる

1. BPMを54.012に設定(プロジェクト最後のBPMをとりあえず最初につけてしまっている?)
2. BPMを140に設定 (1.からtick=0差なのですぐにこのBPMが適用される)
3. 2小節後(tick=96*4*2=768)にBPMを140に設定
4. 2小節後にBPMを130.896に設定
5. 以下16分音符ごとの間隔でBPMを54.012へ下げていく

となっているのがわかりますね。
あとはこれを元にごにょごにょやるだけ。
気が向いたら続きを書きます。

FL Studio 11.0.4 on MacOSX

前にこの記事書いた時にIL-remoteのためにFLをアップデート(FL Studio 11.0.4)してたんですが、
このアップデートのお陰で、MacBookにインストールしているFL Studio MacOS X Beta(これ書いてる時点では最新版が11.0.2)でプロジェクトファイルを開けなくなってしまいました。

そもそも0.2っつーマイナーバージョンアップでプロジェクトファイルの互換性失うのってどうなんだよ?
・・・という話は置いておいて、MacBookに最新版のFLをちゃんと入れられたのでやり方を簡単に書いておきます。

必要なもの

  • FL Studio 11.0.4 インストーラ
  • FLRegkey.Reg (ユーザーページで発行)
  • CrossOver

公式で配布されているベータ版のFL Studio MacOSXの実体はOSXネイティブなアプリではなくて
CrossOverでラッピングしたものになってます。
なので今回はCrossOverを使って自力でFLをインストールします

インストール手順

・・・といってもそんなに書くこともあまり無かったりしますが
手順としてはこう

  1. CrossOverをインストール
  2. FLのインストーラを起動(CrossOverが立ち上がってインストーラを起動しようとする)
  3. FLをインストールしたボトル(CrossOverの仮想マシン?)のレジストリエディタを起動してFLRegKey.Regを登録

わかりにくいやつ

まず最初に躓いたのがインストーラで

スクリーンショット 2014-03-20 22.54.35

途中で真っ白な画面があるんですが、何かを選択しなければならなかったようで先に進みません。
これを回避するにはこの前の画面からウィンドウのフォーカスが変わらないように[Next]を押さなければならないです。

ちなみに、これなんの選択画面だったかというと
スクリーンショット 2014-03-21 0.26.22
上のバナーにもありますがあの悪名高きhaoでした。汚いさすがhao123きたない。

次に躓いたのがレジストリの登録ですが、
このへん見て分かったんですが
CrossOverで作った各ボトルにはちゃんとレジストリエディタが標準でインストールされるようになってます
(各ボトルのdir/drive_c/windows/regedit.exe)
これを起動して、レジストリの取り込み→FLRegKey.regを選択すれば登録完了

おわりに

Image-LineさんがFLのOSXネイティブ対応諦めてるっぽいおかげでMacOSX機でFL使うのはちょっと最初がめんどくさいですが、
自分が使った感じではこのCrossOver環境で十分に使えてると思います。

あと、CrossOver環境における利点も実はあって・・・

windows用のVSTプラグイン(.dll)をそのまま使える!

ので、ぼくのようにwindowsでもmacでも同じ作曲環境を作りたい人にとっては
実はありがたかったりします。