前提・実現したいこと
概要として,二重if文と複数個のデータ,それぞれD1,D2,D3,D4...があり,
一つ目の条件式でD1を出力,二つ目の条件式でD2を出力して一つ目の条件式に戻る
また一つ目の条件式でD3を,二つ目の条件式でD4を...とループさせたいです.
しかし下記のプログラムでは仕様のような動きをせず,D1がそのまま条件式1,2に適用されています.
どうすれば一つの条件式に対し一つの計測値を対応させることが出来るでしょうか?
また,この仕様の動きをさせるには二重if文以外の文がいいでしょうか?
どのようなプログラム文にすればいいか教えてください
該当のソースコード
C++ if (Average < -0.30){ //左に偏りすぎ→最も低い和音C play(chord::```C```); Total = 0; //コードを出力して初期化 if (Average < -0.30){ //左に偏りすぎ→音程そのままマイナー play(chord::```Cm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```Csus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(60, 127); Sleep(375); noteOn(64, 127); Sleep(375); noteOn(67, 127); Sleep(375); noteOn(72, 127); Sleep(375); noteOff(60); noteOff(64); noteOff(67); noteOff(72); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```Dsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```CSm```); Total = 0; //完結 次のコード進行へ } } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→二番目に低い和音DS play(chord::```DS```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```Dm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```CSsus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(63, 127); Sleep(375); noteOn(67, 127); Sleep(375); noteOn(70, 127); Sleep(375); noteOn(75, 127); Sleep(375); noteOff(63); noteOff(67); noteOff(70); noteOff(75); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```Fsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```Em```); Total = 0; //完結 次のコード進行へ } } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→基準の和音FS play(chord::```FS```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```Fm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```Esus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→明るいコード進行FSsus4 play(chord::```FSsus4```); Total = 0; //完結 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```GSsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```Gm```); Total = 0; //完結 次のコード進行へ } } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→2番目に高い和音A play(chord::```A```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```GSm```); Total = 0; //完結 次のコード進行へ } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```Gsus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(69, 127); Sleep(375); noteOn(73, 127); Sleep(375); noteOn(76, 127); Sleep(375); noteOn(81, 127); Sleep(375); noteOff(69); noteOff(73); noteOff(76); noteOff(81); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```Bsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程一個上がってマイナー play(chord::```ASm```); Total = 0; //完結 次のコード進行へ } } else if (0.30 < Average){ //右に偏りすぎ→最も高い和音hiC play(chord::```hiC```); Total = 0; if (Average < -0.30){ //左に偏りすぎ→音程一個下がってマイナー play(chord::```Bm```); Total = 0; //完結 次のコード } else if ((-0.30 <= Average) && (Average < -0.10)){ //左に少し偏っている→低く明るいコード進行和音 play(chord::```ASsus4```); Total = 0; //完結 次のコード進行へ } else if ((-0.10 <= Average) && (Average <= 0.10)){ //正常→転換 noteOn(72, 127); Sleep(375); noteOn(76, 127); Sleep(375); noteOn(79, 127); Sleep(375); noteOn(84, 127); Sleep(375); noteOff(72); noteOff(76); noteOff(79); noteOff(84); Total = 0; //転換 次のコード進行へ } else if ((0.10 < Average) && (Average <= 0.30)){ //右に少し偏っている→高く明るいコード進行和音 play(chord::```hiCsus4```); Total = 0; //完結 次のコード進行へ } else if (0.30 < Average){ //右に偏りすぎ→音程そのままマイナー play(chord::```hiCm```); Total = 0; //完結 次のコード進行へ } }
簡易的なプログラム文
例えば計測データが「0,0,1,0...」だった場合,下記のようなプログラムを経て
C,Cm,hiC,hiCm と出力してほしいのです.
if (Data == 0){ play(chord::C); Total = 0; if (Data == 0){ play(chord::Cm); Total = 0; } else if (Data == 1){ play(chord::Csus4); Total = 0; } } else if (Data == 1){ play(chord::hiC); Total = 0; if (Data == 0){ play(chord::hiCm); Total = 0; } else if (Data == 1){ play(chord::hiCsus4); Total = 0; } }
編集画面でコード部分を選択後、<code>ボタンをクリックして、コードの表示にしてください。
このような形でよろしいでしょうか!
ああ、すみません、コードというのは音楽のコードのことではなくて、プログラムのソースコードのことです。
というか、あなたが1週間前にした質問だとちゃんとプログラムのソースコードがちゃんとした表示になってるようですけど…。
前の質問のやり直しがこの質問ということなら、前の質問はちゃんと終了させておいてください。
MIDIかなにかの再生ルーチンなのかと思いますが、質問が全く理解できません・・・
>>>takabosoft
おっしゃる通りMIDIの出力です.
現状,計測データ一つが条件1,2どちらにも適応されているので,
条件一つにつき一つの計測データだけを適応し,二つ目の条件には2個目の計測データを参照したいのです.
ループさせたい、ということですが条件分岐(if文)しか見当たりません。
書き写して頂いたところ以外の部分に繰り返しのコードが書かれているのでしょうか?
質問内容の話(「2重のifと複数個のデータがどうの…」という話)をすることができる10行程度の完結したコード例を示すとか,あるいはせめて処理フローに無関係な部分を省略するなりした状態のコードを示すことはできないのでしょうか?
>>>riko111さん
いいえ.
繰り返しのコードの書き方が分からなかったのと,実行した際に一つ目の計測データの出力が終わったあと二つ目,三つ目の計測データも順に出力されたので繰り返しのコードは書かれていないです.
>>>fanaさん
追記しますので少々お待ちください!
いや,別に私が待つわけでもないのですが… 現状,質問内容が他者に伝わらないのではないかな,と.
例えば,「複数個のデータ」を何個かのintなりint型配列として「出力」をprintf()か何かにしたようなものでも処理フローの話はできると思うのです.
確認
1.if文で使用されているAverageという変数には何が格納されているのでしょう?
2.1つ目の計測データ、2つ目の計測データ、等と言われていますが、if文に書かれているのは全部おなじAverageなのはなぜですか?
「簡易的なプログラム」を見る限りネストさせる必要はまるでありませんね。
>>>riko111さん
Averageは,この分の前のプログラム文中で,
約7000行のエクセルデータを計算しpush_backで配列にしたものを1500行ずつ総和を出し,それを1500で割った平均値が入っています.
0~1499行分の総和から出した平均が概要中のData1,以下同様です.
つまり、Averageも配列のデータだというとですか?
>>>riko111さん
はい,そのはずです!
>>>Zuishinさん
簡易的なプログラム文においてどういう動きをしてほしいかを追記しましたが,こうだとどうでしょう?
ネスト,というものを調べましたがよくわかりませんでした...
回答2件
あなたの回答
tips
プレビュー