読者です 読者をやめる 読者になる 読者になる

ごちゃログ

はなまるデジタル創作紀行

ピコカキコ向けに高音質なDPCMを用意する手順(私的メモ)

音楽

いろいろ試した結果、個人的にはだいたいこうなりました。

リサンプリング等の手順を何度か行うと思いますが、その際の値はピッチ補正値を決めるのに必要になると思うので、メモをしておきましょう。

  1. 変換元サンプルのループポイント以前のサンプルを削除する(先頭サンプルからしかループできないため)
  2. サンプルレートをバイナリエディタで書き換え、変換後の音程(o4程度の低めの音)に設定する
  3. 33143 Hz にリサンプリングする(foobar2000 の Resampler は品質もそこそこで何より手軽に使える)
  4. サンプル数が 32648 サンプルを大幅に超える場合、NiceLoop 等で短いサンプルになるようにトリミングする(アップサンプリング)
  5. DPCMのサンプル長になるよう再度リサンプリングする(※リサンプリングを繰り返してもDPCMの品質に大きく影響する劣化はおそらくない)
  6. 調整の末、とにかくDPCMで扱えるサンプル数にすることと、サンプリングレートを 33143 Hz にすること(MakeDPCM でリサンプリングさせないため)
  7. MakeDPCM で読み込んで変換する。音量(ダイナミックレンジ)が大きいと思うように変換されないので、音量50%あたりに設定する
    • DPCMの仕様上、波形の急激な変化を記録できないので、周波数の高い波形やダイナミックレンジが大きい波形は不利である
    • 音量を下げるほど良いわけでもない。DPCMの仕様上、波形は常に上下を繰り返してノイズを発しているので、信号レベルが下がることはS/N比が下がることにつながる(と思う)
  8. DMC ファイルを base64 に変換して WAV9 定義にする(わたしは 010 Editor という高機能バイナリエディタ(有料)を使用していますが、無料の方法はいくらでもあります)
  9. おしまい(鳴らすついでに音階の限界も調べておくと良いです)

なお、逆に行わないことにしたのは以下です。

  • 変換前のサンプルを予めローパスフィルターで処理することも特に行わない。高域のサンプルはディザリングの代わりにいいように使われてくれると思う(たぶん)
  • 単純波形のようなサンプルであれば、ディザリングが有効かもしれない?(ただ、そのようなサンプルを WAV9 で鳴らすのはそもそもおすすめできない)

そのほか

  • Lコマンドによる補正値を各波形で一律に揃えたい人は、33143 Hz でチューニング済みの音が鳴るようにリサンプリングする。サンプル数の融通が効かないのでループ作成が大変ですが、クロスフェード等でうまく対処しましょう(という感じだと思うのだけど、わたしにはその方針でやる気力はないので、一律にしている人は尊敬します)
    • もっとも、本当にファミコンで使うようなDPCMはそうするほかありません。

関連

ごちゃのブログが10周年を迎えました

サイト

私のブログが10周年を迎えました。はてなダイアリー(ブログではない)を始めたのが2004年3月23日なので、正確には10周年を迎えてもう半年になります。

10年間で、インターネットのあり方や、自身のあり方は大きく変わったと感じます。新しいメディアだともてはやされたブログも今やすっかり手垢のついたものになりました。せっかくなので10年存続したことに感謝・祝福しつつ、昔と今を振り返って思うことを記念碑的に残しておきたいと思います。

10年前、そこは静かで小さな世界でした

当時、大手サイトはいざ知らず、私にとって発信の場としてのインターネットは小さく閉じた世界でした。それは自分でホームページを立ち上げて、見てくれている人がいるのかいないのかも基本的にはわからない中で、淡々と作ったものや更新ログや日々のことなどを綴る世界です。公開が簡単で、小綺麗で、コメント欄までついているブログの登場には当時「画期的だ!」と感じたものですが、自分の場で「ごった煮」を広げるあり方は変わらず、目の前にあるのは静かで小さな世界のままでした。

もともとが「日記」ですから、大半は本当に大したことを書いていませんでした(具体的には、今日は眠かったとか、診断メーカーの結果的なものとか、ツールの作り直しが少し進んだとか、そんな程度です)。それでも少しずつ常連の方からコメントを頂けるようになって、自分の言葉に反応が返ってくることに嬉しさを感じたことは今でも忘れていません。

今、誰もが電子コトダマ空間にいる世界とブログ

10年でいろいろな変化がありました。

まず、多くのサービスを横断的に使うのが当たり前になりました。pixiv に絵をアップロードして、YouTube に動画をアップロードして、GitHubソースコードをアップロードして……などなど。こうした影響もあってか、ウェブサイトは一つの物事を専門に扱う傾向が強くなったのではないかと考えます。特に検証していませんが、「(誰々)のサイト」よりも「(何々)に関するサイト」という作りの方が最近は多そうです。ブログにもこの傾向は少なからずあるのではないでしょうか。

そして、Twitter などのソーシャル・ネットワーキング・サービスSNS)が普及したことで、ブログよりも簡単に言葉を発することができるようになりました。これにスマートフォンなどモバイルの普及が加わって、いつでも・どこでも・だれでも何かを気軽につぶやける今の世界があります。昔のブログが内包していたコミュニケーションツールとしての側面は、ほとんど SNS に取って代わられてしまった印象です

でも、ブログは滅んではいません。多くのコトダマが140字で綴られては流れていく時代に、章を立てて、さまざまな言葉を尽くして、後に残したい文章を綴る場として、ブログはまだ生きているのではないでしょうか。(用途によっては NAVER まとめ などに立場を奪われている感はありますが……)

私のブログのこれまでとこれから

taillove/miaの日記 に影響を受けて、はてなダイアリーを始めてから10年。早いものです。

10年前であれば、「ブログ10周年だって! みんなのおかげだよ~!ヾ(*>ヮ<*)ノ゙ これからもよろしくっしゅ!☆-(ゝヮ∂*)」とか、ごく個人目線の感想を書いておしまいだったと思います。じつに10年間の(自身か、自身を取り巻く世界の)変容を感じずにはいられません。

上述の通り、ブログを日常を綴る舞台にしたり、雑談の場にしたりする側面は Twitter へと自然に移りました。今後はまとまった Tips 等を書き残す場として、このブログを使っていきたいと思っています。

かつて憧れていたブログの姿は、毎日多くの人が訪れてはコメントで和気あいあいと交流するような場でした。ですが10年を経た今は、代わりに「検索エンジンから何の前知識もなく訪れた人が、その1ページだけを見て『良かった』と思えるような場所にする」ことを目標としたいです。

自ずとペルソナを廃した技術ネタが多くなると思いますが、時々は自身の思いや考え方を整理した文章で書いてみることも大切にすると良いのかな、と、思う面もあります。何か読んでみたい話があれば、ぜひお寄せください。

では、あらためて、

これからもよろしくっしゅ!☆-(ゝヮ∂*)

ブログ名称の変更について

10周年を記念して「悟茶辞苑ッ」から「ごちゃログ」に名称を変更しました。よりシンプルにという思いからです。イガログとは関係ありません。

「ごちゃログ」をよろしくお願いします。

五果娘について

ゼロ年代に本ブログを見てくださっていて、彼女たち(ブログのマスコット的な存在)の唐突なフェードアウトを悲しく思っていた人もひょっとしたらいるかもしれないので、少しだけ言及します。(というか、言及しないのもかわいそうなので……)

そもそもキャラクター同士の会話形式を始めたのは「アイコンが作れたから」「楽しかったから」というごく単純な理由からでした。当時は考えなしだったので内容も大概稚拙でしたが、日常のさほど中身のないことをちょっぴり親しみやすく発信するのには、ただの稚拙な作文と比べたら案外良い効果があったのかも?と今でこそ思います。

フェードアウトした理由はいろいろあります。

  • ブログを書かなくなった
  • 素のHTMLを書くのがつらい(画像の置き場も外部サイトの微妙なURLだったりします)
  • 情報の本体を簡潔に伝えること目標とする方針とは合わなかった
  • 万人向けでもないのかなと思ったりした
  • ちょっぴり……な、なんでもないです

なお、ブログの歩みのすべてがほぼ黒歴史であって、彼女たちが特に黒歴史だとはあまり思っていません。

上記に抵触しなければ、再登場の可能性はあると思います。そのうち会えると良いですね。励ましのおたよりはごらんの宛先やコメント欄までお送りください。(*・ヮ・*)ノ

過去の記事の削除について

方針転換を理由に、現在の方針にそぐわないと感じた500を超える過去の投稿記事を削除しました。消えてしまった内容も Internet Archive: Wayback MachineGoogle のキャッシュなどである程度は見られると思います。

過去に頂いたコメントは内心では生き続けています。いろいろと見て、書いてくださった皆さん、本当にありがとうございました! 10周年ありがとう!

Bizhawk - Multitrack recording とは

TAS

ホットキー設定の一覧を眺めていると「Multitrack」で始まる項目がいくつかあることに気づきます。これは複数のプレイヤーの入力を個々に入力するための機能です(1フレームずつではなく、もっとまとまった単位で)。ただ、どこにも使い方の説明がなかったので、IRCで聞いてみました。

簡単な例**

  1. 2プレイヤーで NES のムービー記録を開始する。(スロット0とかに)ステートセーブして toggle multiple track キーを押したら、increment/decrement を使ってプレイヤー1に設定して、適当に操作する。
  2. プレイヤー2にインクリメントしてステートをロードする。プレイヤー1のボタンを使うと今度はプレイヤー2が操作されて、プレイヤー1はさっき記録した入力が繰り返される。
  3. increment/decrement はあんまり賢くなくて、5プレイヤーまでハードコードされてるよ。利用可能でないプレイヤーを記録しようとしないでね。

らしいです。

Lua for Windows の LUA_PATH 設定(EmuLua からモジュールを使う)

Lua TAS

Lua for Windows には多数のライブラリが含まれていますが、それらをTAS用エミュレータ組み込みの Lua から使おうとしてもロードに失敗します。これはパス設定が適切ではないためです。ロードが成功するようにパス設定を見直しましょう。

このようなタイトルですが、他の環境でライブラリがうまく検索されない場合も同じ解決策を取ることになるでしょう。

環境変数の設定

以下、Lua for Windows v5.1.4-46 についての設定です。

gd.dll などのバイナリモジュールは package.cpath から検索されます。環境変数 LUA_CPATH を設定することで任意のパスを追加できますが、Lua for Windows のインストールでは設定されないようです。よって自前で設定することになります。

LUA_CPATH=;;C:\Program Files (x86)\Lua\5.1\clibs\?.dll

冒頭の ";;" はデフォルトパスを展開するための記述なので、消してはいけません。

Lua モジュールは同様に package.path から検索され、環境変数 LUA_PATH で設定します。一見するとインストール時に設定されるように見えるのですが、拡張子が ?.clua となっているため、*.lua を読み込もうとすると失敗します。よって、こちらも値を変更しなければなりません。

# ?.lua と ?.luac を両方含むように設定する
LUA_PATH=;;C:\Program Files (x86)\Lua\5.1\lua\?.lua;C:\Program Files (x86)\Lua\5.1\lua\?.luac

これで無事にモジュールが使えるようになります。個々のエミュレータのディレクトリを汚す必要がなくなるのですっきりしますよ。

MIDI(SMF)→MML変換ツール「PetiteMM」の紹介・アルゴリズム

音楽

このたび、ごちゃと loveemu さんで PetiteMM という変換ツールを発表しました。開発着手時に「既に優れたツールがあれば開発する必要はないのでは?」と思い各種MIDI2MMLプログラムを比較してみたものの、納得のいくものが見つかりませんでした。

PetiteMM と類似プログラムの性能は比較記事で紹介していますが、PetiteMM は譜面の簡素化と演奏精度の保持を両方がんばっちゃおうという欲張りコンバータです。

インストール・使用方法

PetiteMM からアーカイブファイルをダウンロードして適当なフォルダに展開します。

PetiteMM.bat に MIDI ファイルをドラッグアンドドロップすることで変換が可能です。「'java' は内部コマンドまたは外部コマンド~として認識されていません」と表示される場合、Java のインストールとパス設定が行われていない状態なので、無料Javaソフトウェアをダウンロードしてください。

コマンドオプション

より高度な変換を行う場合、オプション指定を伴うと効果的です。オプションの一覧はバッチファイルをダブルクリックして起動すると表示されます。

PetiteMM.bat の動作時にオプションを有効にしたい場合、PetiteMM.bat をテキストエディタで開き、最初の方にある PMMOPTS 変数にオプションを記述します。

@set PMMOPTS="--dots 2 --no-quantize"

現時点で利用可能なオプションは下記の通りです。

オプション 引数 説明
-o <filename> 出力ファイル名の指定(バッチファイルからは使用しない)
--dots <count> 付点の最大数制限、-1で制限なし(デフォルトは-1)
--timebase <TPQN> MMLの分解能、0でMIDIファイルに合わせる(デフォルトは48)
--input-timebase <TPQN> MIDIファイルの正しい分解能、0なら入力どおり(デフォルトは0、nsf2midiなど特殊用途向け)
--quantize-precision <length> クオンタイズ時の最小ノート長(2のn乗で指定)*1
--no-quantize クオンタイズによるノート長の調整を行わない。タイミングが正確になる代わりに複雑な音符が多くなる。
--octave-reverse オクターブ記号を大小反転する
--use-triplet 三連符らしき箇所を三連符記法に置換する(賢くなく、実用性に乏しい)*2

使い方は以上です。以降は PetiteMM の技術的アプローチに関する説明です。知らなくても特に問題ありませんが、中身を知っているとお望みの変換がしやすくなるかもしれません。

開発動機

既存のツールの出力に満足できなかったので開発しました。

わたしが時々使用していたのは tinymm という簡素なツールだったのですが、連符や細かいタイミングに対応していないため精度は低く、ソースコード非公開のため修正もできませんでした。別のツールを探していくつも試してみたのですが、同じような問題を抱えていたり、複雑なMMLが出力されたりして、満足感が得られませんでした。

  • タイミングのずれを最大限起こさないよう変換する
  • 演奏精度への影響を最小にしつつ、ノートを簡素化して出力する
  • MMLの内部仕様や方言に極力依存せず、幅広く利用できる
  • ソースコードが公開されており、誰でも改変できる

これらを満たしたツールを新たに創造しようとして作られたのが PetiteMM です。

PetiteMM の変換フロー

処理の詳細は後述しますが、以下が変換の主な流れです。

*1:あくまでクオンタイズ時の基準を示すもので、--quantize-precision で16分音符を指定しても、発音タイミングが細ければさらに短い休符等が出現することはある。細かい音符を完全に排除したい場合は --timebase で調整を行う。

*2:--use-triplet を使わない場合でも c12 などの三連符相当の音符は出現する。これを防ぎたい場合は --timebase で3の倍数を指定しなければ良い。

続きを読む

各種MIDI2MMLプログラムを比較してみた

音楽

このたび、ごちゃと loveemu さんで PetiteMM という変換ツールを発表しました。開発に着手する前「既に優れたツールがあれば開発する必要はないのでは?」と思ったのですが、いくつか探して試した限りでは納得行くものが見つかりませんでした。

そんなわけで、この記事ではサンプルファイル mmldec.mid を各種MIDIコンバータにかけて難癖をつけながら、PetiteMM のステマを行っていきたいと思います。

PetiteMM (2013-09-02)

t128r1
/* 最も変換しやすそうな旋律(ベタ打ち) */
o5c8d8e8f8g4a8f8
e8r8d8r8c4.r8
/* Gate ×0.85 */
c16.r32d16.r32e16.r32f16.r32g8..r32a16.r32f16.r32
e16.r8r32d16.r8r32c3r6
/* Gate -4 */
c16.r32d16.r32e16.r32f16.r32g8..r32a16.r32f16.r32
e16.r8r32d16.r8r32c4.r8
/* 途中で長い休符を挟む */
g8.f16e16r16g16r1
r1
r1
r16
f16r16e16r16d8.r16
/* ベロシティ変更 */
g8.f16e16r16g16r16f16r16e16r16d8.r16
d1
/* 三連符、クオンタイズ変更、休符も入れる */
c6d6e6f16r48g16r48a16r48f16r12r48f16r48
/* 長い音符 */
e16e16e16e16d16r16d16r16c1&c1&c4
r4
/* 拍子変更(試しに小節の区切りをまたぐ) */
c8d8e8f8g8a4
f8e16.r32e16.r32d16.r32d16.r32
c2r4
/* 4分音符±1tick */
c4r4c4r4
/* 付点4分音符±1tick */
e4.r8e4.r8
/* 複付点4分音符±1tick */
g4..r16g4..r16
/* クオンタイズを伴う「中途半端なトラック終了」 */
c16d16e16f16g8a16f16e24r12d24r12c48&c64

変換結果を再生できるようにニコニコ大百科にも置きました。タイを ^ から & に置換してコメントを記入しましたが、それ以外はデフォルト設定で変換した通りの出力です。

クオンタイズのための r32 が少々邪魔に感じられますが、精度を16分音符単位に落とせば取り除くことも可能です。

  • MMLの内容のシンプルさを追求しつつ、クオンタイズを極力損なわないよう休符を挿入します。
    • シンプルさを犠牲にしてタイミングを正確に出力できるオプションも備えています。
  • 仕組み上、連符や短い音符によってトラック間でずれが広がっていくようなことは絶対に起こりません。
  • 細かすぎる音符や付点の数を制御する仕組みがあり、ターゲットの制約に合わせた変換が可能です。
  • SMFフォーマット1で単一チャンネルの演奏を複数トラックに分けている場合、個別トラックで出力します。
  • 拍子情報にもとづいて、小節ごとに改行します。(ただしタイでつながっている音符は改行しない*1
  • tick単位による出力 c%24 などは一切出現しません。
  • 和音のあるトラックは単音のみが変換されます。

改善できそうな点もありますが、なかなか良さそうではないでしょうか! (*>ヮ<*)

開発着手時は「きっと既存のツールだって同等以上の性能があるだろう」と思って探したのですが……。

*1:タイで改行しないのは特別に意図があってそうしたわけでもないです。半ば開発上の経緯的な問題です。

続きを読む

FlMMLでPCエンジンのノイズを再現したいと思ったけど

音楽

FlMMLPCエンジンのノイズを再現したいと思ったので、周波数からGB音源やFC音源に近似させてみたいと思いました。

REG FRQ(PCE) FRQ(GB) FlMML
0 1804.21 1638.40 o2c+
1 1864.35 2048.00 o2c
2 1928.63 2048.00 o2c
3 1997.51 2048.00 o2c
4 2071.50 2048.00 o2c
5 2151.17 2048.00 o2c
6 2237.22 2340.57 o1b
7 2330.43 2340.57 o1b
8 2431.76 2340.57 o1b
9 2542.29 2730.67 o1a+
10 2663.35 2730.67 o1a+
11 2796.52 2730.67 o1a+
12 2943.71 2730.67 o1a+
13 3107.24 3276.80 o1a
14 3290.02 3276.80 o1a
15 3495.65 3276.80 o1a
16 3728.69 4096.00 o1g+
17 3995.03 4096.00 o1g+
18 4302.34 4096.00 o1g+
19 4660.87 4681.14 o1g
20 5084.58 5461.33 o1f+
21 5593.04 5461.33 o1f+
22 6214.49 6553.60 o1f
23 6991.30 6553.60 o1f
24 7990.06 8192.00 o1e
25 9321.73 9362.29 o1d+
26 11186.08 10922.67 o1d
27 13982.60 13107.20 o1c+
28 18643.47 18724.57 o0b
29 27965.20 26214.40 o0a
30 55930.40 52428.80 o0f
31 111860.80 131072.00 o0d

あれれー。

REG FRQ(PCE) FRQ(NES) FlMML
0 1804.21 1759.85 o1d
1 1864.35 1759.85 o1d
2 1928.63 1759.85 o1d
3 1997.51 1759.85 o1d
4 2071.50 1759.85 o1d
5 2151.17 1759.85 o1d
6 2237.22 1759.85 o1d
7 2330.43 1759.85 o1d
8 2431.76 1759.85 o1d
9 2542.29 1759.85 o1d
10 2663.35 3523.17 o1c+
11 2796.52 3523.17 o1c+
12 2943.71 3523.17 o1c+
13 3107.24 3523.17 o1c+
14 3290.02 3523.17 o1c+
15 3495.65 3523.17 o1c+
16 3728.69 3523.17 o1c+
17 3995.03 3523.17 o1c+
18 4302.34 4697.57 o1c
19 4660.87 4697.57 o1c
20 5084.58 4697.57 o1c
21 5593.04 4697.57 o1c
22 6214.49 7046.35 o0b
23 6991.30 7046.35 o0b
24 7990.06 7046.35 o0b
25 9321.73 9419.86 o0a+
26 11186.08 9419.86 o0a+
27 13982.60 14092.70 o0a
28 18643.47 17720.52 o0g+
29 27965.20 27965.20 o0f+
30 55930.40 55930.39 o0e
31 111860.80 111860.78 o0d+

結構かぶっちゃうんですね。

@4 のノイズはあれはあれで、乱数ステップのタイミングが線形周期じゃないみたいに見えるので、@N の範囲が128段階とはいえ複雑です。

最初鳴らし方を間違えていて「全然違う」と思ったのですが、正しく鳴らしてみたらほどほど悪くはない近似具合でした。