【发布时间】:2017-02-06 15:45:51
【问题描述】:
我有一个程序,我想创建一个随机生成的音乐小节(每小节 4 拍,使用 C 大调音阶)。但是,我无法理解数学并不断溢出我的 do while 循环,为我想避免的小节创建超过 4 个注释。
我正在使用由我的导师创建的 aServe,但基本上是向播放我评论过的参数的振荡器打开一个流。
/* Program for randomly written bar of 4/4 in C Major */
#include "aservelibs/aservelib.h"
#include <stdio.h>
#include <stdlib.h>
//macros
#define SEMIBREVE (1.0)
#define MINIM (1.0/2)
#define CROTCHET (1.0/4)
#define QUAVER (1.0/8)
#define SEMIQUAVER (1.0/16)
#define DEMISEMIQUAVER (1.0/32)
#define C (261.63)
#define D (293.66)
#define E (329.63)
#define F (349.23)
#define G (391.99)
#define A (440.00)
#define B (493.88)
int millisec(int bpm, double note) {
return (int)(
60 /* seconds */
* 1000 /* milliseconds per second */
* 4 /* crotchets per semibreve */
* note
/ bpm
);
}
int main()
{
int bpm = 120; //BPM Value
double Length[] = {SEMIBREVE, MINIM, CROTCHET, QUAVER, SEMIQUAVER, DEMISEMIQUAVER}; //Array of Note Lengths
double Pitch[] = {C, D, E,F, G, A, B}; //Array of CMajor Scale Freq
int randLength = (rand() % 6); //random positions for note length
int randPitch = ( rand() % 7); //random positions for note pitch
double barTotal = 0; //amount of bar currently completed
do {
if(barTotal < 1) //if bar total is smaller than 1
{
barTotal = Length[randLength] + barTotal; //add note to total
aserveOscillator(0, Pitch[randPitch], 1, 2); //Starts stream to oscialltor
//aserveOscillator(Index,Frequency,Amplitude,WaveType);
aserveSleep(millisec(bpm, Length[randLength])); //play the notes for the length of time specified in milliseconds
randLength = (rand() % 6); //prepare next random note
randPitch = (rand() % 7); //prepare next random pitch
//Output
printf("Note: ");
printf("%lf", Pitch[randPitch]);
printf("\n For: ");
printf("%lf", Length[millisec(bpm,randLength)]);
printf("\n With Bar Total: ");
printf("%lf", barTotal);
printf("\n\n");
}
else
{
if(barTotal != 1) //if bar total is bigger than 4
{
randLength = (rand() % 6); //try another number
}
}
} while (barTotal != 1); //will stop once reaches 4
return 0;
}
【问题讨论】:
-
在您的代码中有几个与值 4 的比较,但似乎整个音符 (SEMIBREVE) 的值为 1.0。如果 1.0 表示条的长度,那么这些比较似乎是不正确的。
-
barTotal是一个double,您正在向其中添加分数。我认为它完全等于 4(从而脱离循环)的可能性非常小。此外,您将它与 4 而不是 4.0 进行比较,我不确定这意味着什么。为什么不使用int来记录笔记的数量? -
@dazedandconfused 我已经修改了我认为可以改变这一点的代码。
-
@yano 如果我错了,请纠正我,但我想要由随机音符长度组成的随机音符数量来填充 4/4 条 - 而不仅仅是 x 个音符。
-
您需要随时间播种随机函数,以便在每次运行时获得不同的值:stackoverflow.com/questions/8314370/…
标签: c audio while-loop infinite-loop