0
0

More than 1 year has passed since last update.

BPMと音符の間隔からn打/秒のnを求めるプログラム

Last updated at Posted at 2022-10-19

初投稿です。
投稿のテストとして簡単なプログラムを作ってみました。
プログラムの内容としては太鼓の達人というゲームである音符の間隔(16分や8分など)が出てきた際に秒速にいくら叩く必要があるかというものです。
例えば、BPM200の曲(Rotter Tarminationやそつおめしき)で24分が出てきた際には秒速20打必要であるとされています。
ちなみにこれはBPM300の曲の16分と秒速の値が同じであり、以下のような式が成り立つと考えました。

叩く回数/秒 = BPMの速さ*(音符の間隔/16)/15

小数点1桁を四捨五入し整数で表現した値とdouble型でそのまま表現した値2つを出すようにしてみました。
0<n<1になる場合は全部1にしました。(ただの個人的な違和感解消のため)

一応BPM、音符の間隔は1以上100000以下想定です。丸め誤差や打ち切り誤差によってプログラムに書いた正確な値が正確な値でない可能性もあります。

書けたプログラムがこちら↓

byousoku.java
import java.util.*;

public class byousoku {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("x音符: xを入力してください");
		double Onpu = sc.nextDouble();
		System.out.println("BPM:y yを入力してください");
		double BPM = sc.nextDouble();
		double tpers = BPM*(Onpu/16)/15;//叩く回数/秒
		int a = (int)tpers;
		double q1 = tpers - a;
		double q2 = a + 1 - tpers;
        if(a == 0 && tpers != 0){
			System.out.println("1打/秒必要です");
			System.out.println("正確な値:" + tpers + "打/秒");
		}
		else if(q1 < q2) {
			System.out.println(a + "打/秒 必要です");
			System.out.println("正確な値:" + tpers + "打/秒");
		}
		else {
			System.out.println(a + 1 + "打/秒 必要です");
			System.out.println("正確な値:" + tpers + "打/秒");
		}
	}
}

出力結果
①BPM180の32分音符

x音符: xを入力してください
32
BPM:y yを入力してください
180
24打/秒 必要です
正確な値:24.0打/秒

②BPM7の300分音符

x音符: xを入力してください
300
BPM:y yを入力してください
7
9打/秒 必要です
正確な値:8.75打/秒

ちゃんと四捨五入されていますね

③BPM1の1分音符

x音符: xを入力してください
1
BPM:y yを入力してください
1
1打/秒必要です
正確な値:0.004166666666666667打/秒

④BPM0の0分音符(例外だけど一応)

x音符: xを入力してください
0
BPM:y yを入力してください
0
0打/秒 必要です
正確な値:0.0打/秒

といった感じで完成しました。
今回は小数点第1桁を四捨五入しましたが小数点第2桁、小数点第3桁で四捨五入したりするのもいいかもしれません。
その際はBigDecimalとかtoString()メソッドとか使って組んでみようかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0