【Cakewalk】MIDIキーボード使ってみたらめちゃくちゃ遅延した

環境
DAW: Cakewalk Version2019.03 Build 20, 64bit
キーボード: PX-750
オーディオインターフェース:なし

DTMを始めて何か所もつまづくことがあって、その一つがMIDIキーボードでの入力だった。
鍵盤を押してからかなり遅れて音が鳴るためリアルタイム入力でメトロノームに合わせて入力することが難しかった。 何とか遅延を抑えて実用できるようになったので試したことをメモ。


やったこと一覧

  • 環境設定>オーディオ>オプション>ドライバモードはMMEのまま
  • 環境設定>MIDI>オプション>ドライバモードはMMEのまま(というよりMMEしか選択できない)
  • MIDIトラックでなくインストゥルメントを使うようにした
  • bluetoothのイヤホンから有線のイヤホンに変えた

だいたいこんな感じ。 ググるとASIOドライバを使えばレイテンシが抑えられるとあって、必死にASIO4ALLを入れようとしていたが、おそらく間違いだった。
理解できていないが、下記ページにこんなことが書いてあった。
[ASIO Driver][第1章 準備編][MIDI講座] 初心者になるための耳コピMIDI講座

【重要】

ここで言う 「ソフト音源」 とは、MSGS や スタンドアロン版の VSC や S-YXG50 のような 「MIDIバイスとして使用するもの」 ではなく、 VSTi のように 「発音するためにはオーディオデバイスを設定する必要があるもの」 のことを指します。

例えば、MSGS は Domino のように 「オーディオデバイスの設定が存在しないもの」 からでも音が鳴ります。

(Domino にあるのは 「MIDIバイスの設定」 だけです。)

この手の 「オーディオデバイスを設定しなくても発音するもの」 は、ASIO に未対応なので、ASIO Driver を使用することは出来ません。

(強制的に MME Driver 経由で発音されます。)

例えば、VSTi の場合は、ホストアプリ側にオーディオデバイスの設定が必ず存在します。

ASIO Driver を使用して レイテンシ (発音遅延) を減らすことが出来るのは、この手の 「発音するためにはオーディオデバイスを設定する必要があるもの」 だけです。

そのうえオーディオのドライバをASIO4ALLにしたらMIDIの音が出なくなったりウェブブラウザの動画の音が出なくなったり、色々わからない点が多すぎた。


MIDIの音が出るタイミングに関してはマウスで入力したときから感じていて、 MIDIと適当なインストゥルメントを同時に鳴らしてみたら明らかに(0.2秒くらい?)遅れていた。
Bluetoothイヤホンに関しても体感でわかるくらい音が出るのが遅れていた。


という過程で最初0.5秒くらいあった遅延があまり気にならないくらいまで抑えることができた。
オーディオ関係は覚えることが多くてすごい大変。

【Linux】yum updateしたら共有フォルダが見えなくなったとき

CentOSをファイルサーバにしていてWindowsからアクセスしているんだけど、 CentOSyum updateをしたら共有ファイルが見えなくなった。
これはSELinuxの設定が消えてしまったかららしい。
下記コマンドを実行することで解決。
sudo chcon -R -t samba_share_t /myshare

参考 void *: Sambaで共有したフォルダが見えるが書き込めない原因がSELinuxである場合とその対処

状態としては、特定のファイルだけは読み書きできるけど、それ以外のファイルは表示すらされていなかった。フォルダだけは見えていた。

SELinuxはSecurity Enhanced Linuxの略。そのままセキュリティを強化したLinuxと思えばいいはず。
今までのファイルごとのパーミッションに追加してラベル付けをしているらしい。

【Python】データフレームに行を追加する方法【Pandas】

データフレームを1行ずつ追加する方法。
複数行ずつでも同じやり方でできる。

1. DataFrameのappendを使う

merged = pd.DataFrame()
for idx in range(10):
    temp_df= pd.DataFrame([idx], columns=['col'])
    merged = merged.append(temp_df)
merged = merged.reset_index(drop=True)

いちいちDataFrameのインスタンスを作り直しているため計算が遅い。
けど楽に書ける。


2. DataFrameのconcatを使う

df_list = []
for idx in range(10):
    temp_df = pd.DataFrame([idx], columns=['col'])
    df_list.append(temp_df)
merged = pd.concat(df_list)
merged = merged.reset_index(drop=True)

計算は速いけどリストを作らないといけない。


3. dictのlistを使う

dict_list = []
for idx in range(10):
    temp_dict = {'col' : idx}
    dict_list .append(temp_dict)
merged = pd.DataFrame(dict_list)
merged = merged.reset_index(drop=True)

方法2とメリットデメリットは同じ。

【Excel】VLOOKUPは忘れてINDEX/MATCHを使おう

VLOOKUPは正直使いにくい。

  • 検索カラムが参照カラムより左にないといけない。
  • 列を並び替えると壊れる。
  • 横に長いと何番目かわからない

など。
というわけで、INDEX/MATCHを使ったほうがいい。

=VLOOKUP(C2, $A:$B, 2)
=INDEX($B:$B, MATCH(C2, $A:$A, 0))

2つは同値。

【Python】凡例の位置を画像座標で指定する

グラフの凡例を画像座標で指定したいときは、下記のように座標変換する。

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(211) #テストのためにグラフをずらす.

fig_posX = 0.5 #画像座標X
fig_posY = 0.75 #画像座標Y
ax.set_xlim([-10, 20]) #テストのためにx軸座標の範囲を変更。

#データプロット
ax.plot(0, 0, color='red', label='1')
ax.plot(1, 1, color='blue', label='2')

#figの座標からグラフのBBox座標に変換
ax_zahyouX = (fig_posX - ax.axes.get_position().x0) / ax.axes.get_position().width
ax_zahyouY = (fig_posY - ax.axes.get_position().y0) / ax.axes.get_position().height
print(ax_zahyouX, ax_zahyouY)

#凡例を表示
ax.legend(bbox_to_anchor=(ax_zahyouX, ax_zahyouY), loc='upper left')
fig.text(fig_posX, fig_posY, 'TEXT') #上の命令と同じ位置に表示される(基点は異なる)。

#グラフ表示
plt.show()

f:id:gushigo:20180826003424p:plain

軸タイトルや軸の値を変更してグラフを作ると、グラフの領域がずれることがある。
凡例などの位置を固定したいときはこんな感じでやるしかない?
ほかにもっといいやり方はあるかも。