質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

Q&A

解決済

2回答

6070閲覧

曲の譜面を自動で生成する方法について

reishisu

総合スコア39

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

0グッド

1クリップ

投稿2019/01/18 17:33

編集2019/01/25 08:54

前提・実現したいこと

現在、UnityとC#で譜面を自動生成するプログラムを作ろうとしております。

今までは、曲の波形データからBPMと曲全体の音の大きさから曲の平均の音の大きさを調べて曲の各BPMのタイミングで「音の大きさが曲全体の音の大きさを超えてたら」譜面を生成するといった流れてやっておりましたが明らかに曲とあっていないように感じ周りの方からも全然合ってないと指摘されてしまいました。

私自身音声工学について知見がなく周りにも詳しい方がいないので、一般的にはどのように自動で譜面を生成されているのかご教授頂きたいです。。。

一応、次にこれから試そうとしているのは自分で調べたBPM自体は実際の曲のBPMと一致していたので、平均の音の大きさでやっていることが違うのかなと思い、音を周波数毎に分類して各BPMのタイミングで一番大きい周波数を注目して曲全体のその周波数の平均の大きさで生成するタイミングを決めた方がいいのかと思いました。
周波数取得までの流れは、AudioClipのGetDataで曲の波形データを取得して、C#のMathNet.Numericsを使って取得した波形データを先頭から2のべき乗(今回は2048)個ずつFFT処理を行い、渡した配列の秒数毎(サンプリング周波数44100Hz、チャンネル数2chなら0.023219954648526秒毎)に周波数を調べていく予定です。(今回リアルタイムではなく予め、譜面を生成したいのでAudioSouceのGetSpectrumDataは使わない予定です。)

長文で申し訳ないのですがどうか回答よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

MacBook Pro (15-inch, 2016)
プロセッサ : 2.6 GHz Intel Core i7
メモリ : 16 GB 2133 MHz LPDDR3
OS : macOS Mojave
Unityバージョン : Unity 2018.2.2f1
.Net バージョン : 4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

楽曲の波形データを1フレーム2^13(=8192)個で区切ってFFT処理をした後、20Hz~2000Hz間の和を取り1つ前のフレーム毎の差分を調べ大きくなった時に譜面を生成する感じでやったら上手く動きました(´∀`)

今はさらに精度を上げるために模索中です。

投稿2019/01/25 21:25

編集2019/02/13 10:12
reishisu

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

推測による回答です。

「平均」との比較だと、曲によってブレが大きくなるんじゃないかと思います。
「前フレームとの比較」の方が明確な強弱が取れるのではないでしょうか?
Unity GetSpectrumDataで音ゲーの譜面を自動生成(2) - LemonteaのUnity部屋

それでも最適解を自動で求めるのは難しいですし(自動で生成出来たとして、それが面白いか?は別)、
自動でざっくり作成→人力で手直し、を前提にした方がいいかなと思います。
(ガチでやると論文クラスになる様子→機械学習で『DDR』の譜面を自動生成する論文が話題、カリフォリニア大学の研究チームによる発表 | AUTOMATON

投稿2019/01/19 07:15

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reishisu

2019/01/19 08:01

回答して頂きありがとうございます! 仰る通りで、自分の浅はかな考えだと感じてとても恥ずかしいです.... 参考リンクまで感謝です、「LemonteaのUnity部屋」様は以前参考にさせて頂いたのですが確かこの時はAudioSouceのGetSpectrumで周波数分解されてたのであまり気にしておりませんでしたが、今改めて見てみると確かに前フレームとの比較はとても良さそうな感じがします!! (リズムゲームを作成しておりhttps://teratail.com/questions/163869の方法でAudioClipにしたiOSのミュージックライブラリの曲を使って生成しますので予め譜面を準備するのは厳しいのと、AudioSourceだとリアルタイムでノーツを生成することになり音ズレと生成してからだと移動している間にラグが生まれてどうしても今回のだと合わないと思いました。) 少し腑に落ちない点がありましてやはり前フレームとの差分が必要になるのですがそこでの基準を一概に決めてしまうとこちらの方法でも曲によって「ブレ」が大きくなってしまうのでは無いかと思いました... なので、現在調べてみる中でまだ実装まではできておりませんが主に譜面はドラムを基準にすればいいのでは?と考えて低音である(0~300Hz)の周波数の合計をフレーム毎に計算して、そこから曲全体の低音の平均を見て低音だけで比較したらいいのではと考えております。 http://chanoma.realfreedom.jp/archives/3713 確かに、機械学習で実装するっていう発想は本当に凄いですね> < 自分のイメージなのでいい方法なのかは検討がついておりませんが、波形データを曲全体にするのではなく配列なのでいくつかに分割してそれぞれでBPMを求めて、分割した配列内でそれぞれのBPMから差分をとるという方法で上手くハマるのでは?と考えましたがどうでしょうか? 長文になってしまい申し訳ございません...
sakura_hana

2019/01/21 02:54

とりあえずBPMの測定については以下のページが見付かりました。 http://ism1000ch.hatenablog.com/entry/2014/07/08/164124 (そもそもBPM取得が本当に必要か?というのもありますが) 私もざっくりと検索した程度の知識しか無いので詳しくは何とも言えないです。 投げやりで申し訳無いのですが、あまり情報が無いということは動作させつつ検証を進めるしかないとは思います。 UnityやC#に限らず調べていくといいのではないでしょうか(既にやっているなら申し訳ありません)。
reishisu

2019/01/21 03:29

返信&リンクまで貼って頂きありがとうございます>< 一応、BPMの測定自体は出来ており個人的にはリズムゲームにおいてテンポと譜面は重要だと考えております。(音ゲーを廃人プレイするほどでは無いので断言は出来ないですが...) いらないと思いますが、私がC#でBPM解析の実装をするときに参考にさせて頂いたリンク貼りますね。 http://hp.vector.co.jp/authors/VA046927/tempo/tempo.html 自分もここ3ヶ月ほど調べているのですが、やはりBPMやテンポ解析については結構紹介されているサイトは結構あるのですがリズムゲームのような自動で譜面を生成するのはほぼ情報が無いですよね。。。 周りにこういった学術?的な相談をできる方がいないのでUnity総合1位の方に親身に話を聴いてくださり、相談できるだけで頭が整理されたような気がして本当にありがたいです(>_<) なので、新しい情報がわかるまでは自分なりに手当たり次第試していき自分なりに納得がいく実装ができればブログなので参考の一助になるようにまとめようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問