プレイ日記
ish owlis1
ランダム再生を切り替えるため、MMLがかけない私がMML解析機を書いている最中(曲長のみ取得) 他機種のMMLの仕様は知らないですが、smailbasicのMMLが随分自由な文法で書けるのだなぁと。 説明書は仕様書じゃないので、記述構文だけ鵜呑み解析じゃダメですね。現在、秒単位で絶賛ズレまくってますorz new3DSでも解析は結構重いので、拡張キット扱いにした方がいいのかなぁ。 あと、一番長い音長のチャンネルを表示しているのですが主旋律って訳でも無いのが悩みどころで(^^; とりあえず現在公開させて位いただいている曲全てが解析できたのは確認。もっとも正しい曲長なのかは検証しきれていませんが。
13そうだね
プレイ済み
返信[1]
親投稿
ish owlis1
デフォルト(L)の扱いは特殊なのでしょうか(^^ これだと、チャンネル0と1は長さが同じ :0 CDEFCDEF :1 A.B.FA.B.F これだと、チャンネル0と1は長さが違う l32 :0 CDEFCDEF :1 A.B.FA.B.F これだと揃う :0L32 CDEFCDEF :1L32 A.B.FA.B.F テンポ(T)はチャンネル外に書いても、どちらにも影響が出る
0そうだね
プレイ済み
返信[2]
親投稿
ish owlis1
さらに検証 T200 {AB=T120CDEFCDEF}{CD=T10CDEFT120CDEF} :0T250[{AB}]:1[{CD}] チャンネル1のテンポでチャンネル0も動く 状況証拠かつ憶測だが、あとで評価されたチャンネルのテンポが、他のチャンネルまで影響するみたい。
0そうだね
プレイ済み
返信[3]
親投稿
ish owlis1
テンポに関してはMML書いてる人には常識でしょうか。 経験の無さが、こういった場所で如実になります。 逆に考えると、テンポ指定がされているチャンネルがあった場合、そのチャンネルの曲長が曲の長さとして良いのでしょうか。 そうであれば、解析する範囲が大幅に少なくなり速度向上も期待ができますな。 どちらにせよ、作り直す必要が出てきたわけなので、そのような仕様に変更するのも検討してみようかと。 長い独り言状態ですが、識者の方が読まれており、かつ見解がありましたらコメント願いします。
0そうだね
プレイ済み
返信[4]
親投稿
ナツキ natukin1978
私はMMLの生成や解析するツールを作っていますので調べてみて分かった事を書きます。間違えている事があるかもしれませんがご容赦ください。 デフォルト音長(L)の件 デフォルト音長はチャンネル毎に設定するみたいです。最初のチャンネル指定より手前で設定しても全チャンネル同じ音長にはならなかった記憶があります。 デフォルト音長(L)を指定しない場合は4を設定している事になるようです。 ish さんの最初の例でチャンネル0と1は長さが同じになるのは全チャンネルのデフォルト音長が4になっているためです。 テンポ(T)の件 テンポは全チャンネルに影響を与える設定みたいです。いずれかのチャンネルでテンポ設定すると他のチャンネルのテンポも同時に変わった記憶があります。 となると全チャンネルの流れを追わないと演奏時間を求める事はできません。
1そうだね
プレイ済み
返信[5]
親投稿
ish owlis1
ナツキ さん コメントありがとうございます。 なんとなく予想はしていたのですが「そうでしたかー」というのが正直な所です。 取得したい曲長は「主旋律が判断できない」という根本的かつ致命的な問題が解決できないので、どこか落とし所を決めて「ざっくり曲長」がわかるぐらい機能で留めて置こうかと。 もともと「ランダム再生する機能でループする曲を、どのタイミングで止めるかを判断」するための機能ですから(^^。 お話にもありましたが、説明書に書かれていない仕様はこんな感じかと。 * デフォルト音長(L)とテンポ(T)の初期値は4と120 * チャンネル指定しないデフォルト音長は、チャンネル0に影響する * テンポは全チャンネルに影響して、違うチャンネルでかつ同じタイミングでテンポ変更した場合、後の設定が勝つ(ような気が)
1そうだね
プレイ済み
返信[6]
親投稿
ish owlis1
スピード向上を期待して、即時に音長を計算していますが。 チャンネル毎の音長と、テンポの切り替えタイミングを別の配列に取得して、最後に全体の曲長を計算するのが正解って所ですかね。 で、同じタイミングでテンポ切り替えした場合は、チャンネルの順番関係なしに書いた順番で上書きされる(だといいなぁ)といったところか。
0そうだね
プレイ済み
返信[7]
親投稿
ナツキ natukin1978
ツールで出力したMMLならある程度の枠組に従っているはずですので、解析はやりやすそうですが手書きなど自由な文法で書いたものを解析するのなるとかなり大変そうです。 ish さんの言われる通り、主旋律が判断できない以上どこか落とし所を決めてざっくりと曲長を調査するのが現実的だと思います。 ちょっと邪道かもしれませんが、MMLから無限ループを取り除く加工を行い、演奏が停止した時に次の曲に切り替えるとか。
2そうだね
プレイ済み
返信[8]
親投稿
ish owlis1
邪道と言われる方法、実は私も開発初期時点では検討していました。 マクロの解析ロジックができた時点で、試験と曲の実装状況の調査を兼ねて、お預かりしているMMLを全て解析かけてみました。 そこで分かったのが、MMLの書かれ方が千差万別で、人によっては実験的なMMLを書かれ公開されているという状況でした。 極端な例ですが、主旋律35秒に対して、他チャンネルが100時間以上の長さでループしている曲とかありまして。単純にループ外すだけですと少しまずいなぁと。
1そうだね
プレイ済み
返信[9]
親投稿
ish owlis1
テンポ周りの対応 とりあえず完了。 高速化を期待して色々と手を抜いた場所が、ことごとく裏目に出るという結果に。まぁ、解析ミスも多かったのですが さて、グローバル変数に影響しないDEF化したけど必要な人 いらっしゃるのかなぁ。 素直に作らなかった分、DEFの引数が随分増えて可読性が低いと思いますが(^^;
0そうだね
プレイ済み
返信[10]
親投稿
ish owlis1
読み返したら、酷い嘘を言っていた 訂正 誤 他チャンネルが100時間 ↓ 正 他チャンネルが100分
0そうだね
プレイ済み