作りたいもののポエム4
概要
4つ目、そろそろ実装に行きたい。
ところでこないだ真理を思い出したので設計が非常に単純になった。
唐突に真理を思い出したんだけど、音符一音一音に対するモーフィングとかいらないんだった。要件が一個落ちて簡単になるぞ。
— コーラデブ@shurabaP (@shurabaP) 2016, 2月 18
どういうことかというと、ある音符内でのモーフィングは実は不要で、 もし音に表情を付けたいのであれば音符ごとの強弱だけで十分まかなえるということ。 何か根拠があるわけではないけれどぼくは研究者ではないし、 気持ちとしては作曲者なので経験則に従いたい。
作りたいもの
- UTAU 音源より表現力の高い音源形式
- ↑のファイル読み書き部分
要件
- 既存リソースを活かすために UTAU 音源からインポートをできること
- 波形情報と演奏情報とキャラクタ情報は厳密に分けて設計すること
- 欲を言えば複数音源を自在に切り替え、あるいは混ぜられるようにすること(キャラクタの枠組みを越えるべき)
データ設計
segment (切りだされた波形)
segment は波形ファイルへの参照と波形の切り出し位置、伸長の位置を指定する。
{ "id": "segment0001" "path": "akasatana.wav", "begin": 500, "length": 500, "temporal_position" : 100, "front_fixed_range" : 100, "rear_fixed_range" : 100 }
- id: segment ID
- begin: 開始位置
- length: 波形長
- temporal_position: ビートの位置(先行発音相当)
- front_fixed_range: 前半の固定長(固定長相当)
- rear_fixed_range: 後半の固定長
mapping(発音・音程・Velocityと、波形との対応)
ある発音がある音程である Velocity で指定された際にどの波形をどの程度利用するのかというマッピングを表す。
{ "pronounce" : { "before" : "a" "this" : "k a" "after" : "s a" }, "segments": [ { "segment_id": "segment0001", "range" : { "begin" : { "velocity": 0, "note": 0 }, "end" : { "velocity": 127, "note": 63 } } }, { "segment_id": "segment0002", "note": { "range" : { "begin" : { "velocity": 0, "note": 64 }, "end" : { "velocity": 127, "note": 127 } } } } ] }
- pronounce: 発音
- before: 先行音の発音(optional)
- this: 発音
- after: 後続音の発音(optional)
- segments: マッピングされるセグメント群
- segment_id: セグメントの識別子
- range: このセグメントが使用される範囲
- begin: 範囲の開始位置
- end: 範囲の終了位置
途中でのモーフィングが要らないためこれだけで表現が可能である。 基本的に既存のサンプラーと全く同じ仕組みだが、発音による検索が必要になるイメージ。
メタ情報(音源の名前とか)
{ "id": "澪音此羽", "version": "1.0.0", "author": "Hal@shurabaP", "web": "http://blog.hatena.ne.jp/shurabaP", "icon": "example.png", "path_type": "url", "url": "http://blog.hatena.ne.jp/shurabaP/reine_koreha", "mappings": "example.mappings", "segments": "example.segments", "description": "例ね、これは。" }
細かい形式
- pronounce
${consonant} ${vowel}
の形式で表す。子音が存在しない場合は前半を省略する。
- velocity, note
- 0-127 の 128 段階の整数
- begin, length など時間の位置
- ミリ秒で記す、どうせボコーダーがあじゃこじゃやるのに窓幅とかあるし適当でええやろ
- path
- path_type
- file か url の文字列をとること
悩みどころ
segments, mappings を JSON の配列にするべきかそれともファイルごとにするべきか。
たぶんだけど一個にまとめておいて遅ければ分割するのを考えるほうがいい気がする。