コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
takumi ◆Ce3Q40uXWJjn
2018/6/21 20:26
質問
BGMの表示について
今、BGMツールを作っています(MUSIC_TAKUMI)。
そのツールの中に、BGMの時間を表示したいです。
どうしたら表示できるか、わかる方教えてください!!

コメント

アバター
moi 2018/6/21 20:36 ◆hL/XpFV8MD2F
BGMの合計時間は、実際に計らないとわからないです。
BGMPLAY 流したい曲
WHILE BGMCHK()
A=A+1
CLS
?A
WAIT 60
WEND

現在の時間は、
BGM流してるときに
A=A+1/60
?FORMAT$("%02D",(A DIV 60));".";FORMAT$("%02D",(A MOD 60));"/";実際に計った時間
アバター
あまさとしおん 2018/6/22 16:50 ◆mzDKTVUAtwqE
もし、そのBGMのMMLがあるならば、解析することで計算することが可能です。(ただし、途中でテンポが変わる場合は処理が大変なことになります)

プリセットBGMのMMLを取得することはできませんので、プリセットBGMの時間を計算することはできません。
アバター
しんしん 2018/6/22 20:17 ◆F5jfeXS93jff
自分が作ったときは、MILLISECを使って
経過時間(秒)=FLOOR(((今のMILLISEC)-(BGM再生開始時のMILLISEC))/1000)
て感じに計算してました。

プリセットBGMのだいたいの時間については↓に素晴らしいデータがあるので見てみるといいかもしれません
http://wiki.hosiken.jp/petc3gou/?Memo#j9f4308c
アバター
takumi 2018/6/22 22:06 ◆Ce3Q40uXWJjn
みなさん、ありがとうございます!!
あまさとしおんさん、具体的にどうすればMMLのあるBGMの時間(分・秒)が分かるのでしょうか…
色々言ってすみません。
また、moiさん、しんしんさん、ありがとうございます!!
また、参考になるサイトを教えていただき助かりました!!
アバター
ZEX 2018/6/23 23:06 ◆RrwFtq39WJM3
答えられる中級者が居ない様なのでヒントを

MMLを解析すれば再生時間を求めることはできる。
MMLはSmileBASICからすれば単なる文字列なので、1文字ずつ切り出して判別できる。

それにはSmileBASICの基礎知識と文字列の扱い方を知らなくてはならない。
http://petitcom.net/3gou/category/intstrary/string

次にMMLがどの様な文字で構成されているのか理解する必要がある。
https://smileboom.com/special/ptcm2/co_manual/p10.php#3

MMLって音楽の譜面を文字だけで表したものなので、音楽の知識も必要となる。
と言っても、知る必要があるのは時間的なものだけだ。

譜面には音符があり、音符は音の高さだけでなく、音の長さの情報でもある。
音が鳴らない所は休符だ、これにも長さがある。

MMLでは音符はドレミファソラシをCDEFGABで表現する、休符はR

では音符や休符って、どうやって長さを表現しているのか、
それは、全音符(MMLではC1)を基準として
全音符の1/2の長さが2分音符(MMLではC2)
全音符の1/4の長さが4分音符(MMLではC4)
全音符の1/8の長さが8分音符♪(MMLではC8)
全音符の1/16の長さが16分音符(MMLではC16)
全音符の1/32の長さが32分音符(MMLではC32)
といった具合だ。

連続する音符と休符の長さを全て合算すれば、曲の長さが求まる。
アバター
ZEX 2018/6/23 23:07 ◆RrwFtq39WJM3
では時間はどうやって求めるのか。
曲にはテンポがあり、同じ曲でもテンポを変えれば再生時間は変わってくる。
テンポが変わっても音符の長さの割合は変わらないため、音符は割合で表現されているのだろう。
テンポ120をMMLではT120と表現する。
ではテンポの値はどんな意味があるかと言うと、

1分間に4分音符が幾つ鳴るのか、その数を意味する。

T120とは、60秒間に4分音符が120回鳴る速度である。
これを逆算すると、T120の時、4分音符1つの時間は、
60秒 ÷ T120 = 0.5秒 と求まる。
あとは計算はできるだろう、小学生レベルの計算だ。

MMLについてはよく理解した方が良い。
Tは省略される場合がある、その場合 デフォルト 120 だったかな。
音符は音程表現で#半音上がる MMLでは C# C+、半音下がる C-と言った表現も出てくる。
音符はCDEFGABだけじゃないし、(Nというのもある)
音符の長さの表現として付点音符 MMLでは . が付くものもある、
例えば付点4分音符 C4. この場合の長さは4分音符の1.5倍の長さである。
音符の長さが省略されることもある、その場合、L4で指定した長さとなる、
L も省略されることがある、その場合、Lの長さのデフォルト 4 だったかな。
MMLでは和音を表現するためチャンネル区切り : がある。
全てのチャンネルが同じ時間の長さである保証は無いので、
全チャンネルの時間をそれぞれ求め、一番長い時間を曲の時間とするのが良いだろう。
繰り返し表現もある [ ]2 だ。
[]の後ろの数字が繰り返し回数で、[]の間にあるMMLを繰り返す。
[]はネストが可能で、[]の後ろの数字が省略されることもある、その場合は無限である。
マクロが定義されているものはマクロの展開も必要だ。
マクロもネストが可能である。
これらを全て解析しなければならない。
アバター
ZEX 2018/6/27 0:13 ◆RrwFtq39WJM3
因みに

付点は複数書ける、これを複付点音符という。
長さは
C1. 全音符+2分音符
C1.. 全音符+2分音符+4分音符
C1... 全音符+2分音符+4分音符+8分音符
C1.... 全音符+2分音符+4分音符+8分音符+16分音符
どこまでも続く

繰り返しの中にマクロ展開が入る場合もあるし、
マクロ定義に繰り返しが入ることもある。
マクロ定義に他のマクロ展開が入ることもある。
なので展開は結構面倒だ。
プレーンテキストになるまで展開するロジックを考えてみるといい。

まぁそこまでのやる気は無いのだろうけど。
アバター
ツララ 2018/6/27 6:03 ◆ArUdBYOYME1V
処理の進捗状況を表示するプログレスバーを作る時も、まず下準備で行程完了までをカウントしてから
そのカウント数を分母として全体の長さを調整するのと同じですな
ループ制御に使ってる変数から計算出来るんならそれに越した事はないですけど
実測した方が手っ取り早いですし

ZEXさんの愛のムチ、いいですな
takumiさんならここまで言われたら絶対やるだろうって思いが無いと最後の一文は書けませんな
(そう思う根拠はZEXさんが大抵参考リンク先を貼って済ましてる人だからなんですけど)
アバター
だにえる 2018/6/27 11:34 ◆m76OCAQyrWGt
MMLの仕様はmkIIと3号で全く同じなの??
アバター
takumi 2018/6/27 15:37 ◆Ce3Q40uXWJjn
みなさん、ありがとうございました!!
後、返信できずにすみません。
(小学生6年なので。)
僕には少し難しそうなので、もう少し勉強します。
ZEXさん、参考にさせていただきます!!
アバター
ZEX 2018/6/29 1:49 ◆RrwFtq39WJM3
>MMLの仕様はmkIIと3号で全く同じなの??

上位互換だね、差は比較してみれば判ること

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -