やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

pyxeleditorにおけるSoundエディタの使い方

 BGMのフレーズを作る。

f:id:ytyaru:20200329143149p:plain

 獣を玉にいれて戦わせる人たちが道端でなにかを拾ったときの音。「テテテテーン♪」

仕様

  • 1 pyxres = 64 sound
  • 1 sound = 6 小節 (最大。4等でも可)
  • 1 小節 = 8 note
  • 同時発音数 = 1
  • 音高 = 5 octave
  • SPEED: 199
  • TON: t,s,p,n
  • VOL: 07
  • EFX: n,s,v,f

TON (音色)

t Triangle 三角波
s Square 矩形波
p Pulse パルス波
n Noise ノイズ

EFX (効果)

n None なし
s Slide スライド(なめらかに変化する)
v Vibrato ビブラート(音高が揺れる)
f FadeOut フェードアウト(音量が減衰する)

VOL(音量)

 07

画面構成

f:id:ytyaru:20200329193435p:plain

ショートカットキー一覧

キー 意味
, タイムラインの移動
, フォーカス遷移:ピアノロール、効果ロール、TONVOLEFX
Space 再生/停止
L ループ ON/OFF

ピアノロール

 音の確認。キーボードをピアノ鍵盤に見立てた配置になっている。ピアノロール横にあるスクロールバーの範囲がキーボードに対応している。

key 対応鍵盤
1 黒鍵盤。音高+1
Q 白鍵盤。音高+1
A 黒鍵盤。音高+0
Z 白鍵盤。音高+0
PgUp 音高(octave)を+1する: 03
PgDn 音高(octave)を-1する: 03
  • 1キーは鍵盤で出す音色TONEの変更
  • Zキーが(C)の音である。そこからピアノ鍵盤の位置と連動している。(1オクターブ分)
  • Aキーは休符
  • これらのキーを押下中にEnterキーを押下すると音符(ノート)を置ける
  • リアルタイム演奏はできなかった。反応が遅いため

 詳細はソースコードをみて調査した。

キー操作だけで作曲する

  • ピアノロール画面
    1. ,でタイムラインを移動させる
    2. PgUp,PgDnで音高pitchを移動する(スクロール)
    3. Z等で音を鳴らす
    4. 2の最中にEnterキー押下してノートを置く
    5. で効果ロールへ遷移
  • 効果ロール画面
    1. ,でタイムラインを移動させる
    2. ,TON,VOL,EFX間を移動する
    3. TONt,s,p,nVOL07EFXn,s,v,f
  • 共通
    • Spaceキーで再生・停止
    • LキーでループON/OFF切替
    • Ctrl+Sで保存
    • ESCで終了

 以下ができない……。

  • SOUND選択
  • SPEED選択
  • 指定位置にある音高の変更(追加でなく変更)

 特に音高の変更ができないのは辛い。

不満

  • ノートの範囲選択ができない
    • 一括コピー・カット・ペースト(挿入・上書き)・削除(休符)できない
  • sound間コピペできない

Q&A

音がつながってしまう。切りたい。スタッカートしたい

  • EFXFを指定する

 1ノートごとに指定する。元に戻す(つなげる)ときはEFXn

pyxresファイル

 以下のように作曲したとする。soundがどう保存されているか解析してみた。

f:id:ytyaru:20200329143149p:plain

  1. my_resource.pyxresファイルをコピーする
  2. my_resource.pyxre.zipとリネームする
  3. 2をunzipコマンドで展開する
  4. pyxel_resourceというディレクトリができる
  5. sound00ファイルを閲覧する
  6. 以下のようなファイル内容だった
2626262d2d2dffff
none
none
333003
16
  • 最終行の16SPEEDである
  • 最終行より上の3行は効果である
    • TON: なし(none)
    • VOL: なし(none)
    • EFX: FFFnnF(333003)
        * `FadeOut`=`3`, `None`=`0`と思われる
      
  • 最初行は音高である(最後の2音は休符。ffとなっていることから16進数と思われる)
    • 26,26,26,2d,2d,2d,ff,ff
    • MIDIと同じなら0127までの128音高ある。これを16進数にした?
        * pyxelのsoundは5オクターブしかないっぽい。1オクターブ=12音高。5オクターブ=60音高。
      
    • 休符はff(10進数(signed byte:-1, unsigned byte:255))。

 この辺をちゃんと明らかにすればテキストエディタで作曲できそう。

 というわけで調査用pyxresファイルを以下のように作った。

img

 先述の手順にてsound00ファイルの内容を見ると以下。

003b
0123
01234567
0123
30

 以下のように判明した。

項目
音高 16進数(003b)。休符=ff
TON Triangle 0
TON Square 1
TON Pulse 2
TON Noise 3
VOL 07
EFX None 0
EFX Slide 1
EFX Vibrato 2
EFX FadeOut 3
SPEED 099

 これでもうテキストエディタで作曲できる。

ショートカットキーの探し方

 ソースコードを見るしかなかった。公式ドキュメントに書いてくれよ……。

std::map<char, int> NOTE_TABLE = {
    {'c', 0}, {'d', 2}, {'e', 4}, {'f', 5}, {'g', 7}, {'a', 9}, {'b', 11},
};

std::map<char, int> TONE_TABLE = {
    {'t', TONE_TRIANGLE},
    {'s', TONE_SQUARE},
    {'p', TONE_PULSE},
    {'n', TONE_NOISE},
};

std::map<char, int> EFFECT_TABLE = {
    {'n', EFFECT_NONE},
    {'s', EFFECT_SLIDE},
    {'v', EFFECT_VIBRATO},
    {'f', EFFECT_FADEOUT},
};

参考

前回まで

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux