我正在做一个小程序来生成随机旋律。到目前为止,我有一个带有频率的音符数组,程序从数组中选择一个随机元素并播放它的频率。问题是旋律“听起来很糟糕”:就好像你坐在钢琴前随机弹奏一样。我需要一种算法来生成旋律,包括频率和时间等等。我不需要任何复杂的东西,只需制作一个听起来不错的旋律。
6 回答
使用现有音乐(MIDI?)来训练马尔科夫模型或马尔科夫链 。您可能希望将输入移调到相同的键,例如 C 大调、A 小调。音高*持续时间可能必须被编码(枚举)成一维 (x*7*5, or x*12*5) 。[x := 输入范围内的八度音阶数,5=持续时间,1 到 1/16th ] 循环和变化的额外奖励,但这会更难......
如果您希望音乐“轻快”且从不不和谐,请使用五声音阶(即像弹钢琴的黑键)
例如:音高选择:
C#,D#,F#,G# or A#
音高范围:3 到 5 个八度音程(因为向上或向下八度音程基本上是您的基本频率的频率加倍或减半)
注意持续时间:
范围从16th
到Whole Note
其他人已经尝试过这个。您可能想阅读 Richard MacDuff 的文章“音乐和分形景观”。
尝试从相同的音阶演奏音符:) C 大调、D 小调左右;) 甚至是五声音阶。
导入 java.io。;
导入 javax.sound.sampled。;
类我{
公共静态无效主(字符串[]参数){
int fij = 128;整数 tw=64;int fd=2048;
整数秒=128;字符串 fo="Me.wav"; 诠释何=8;
if(args.length==5){ fij=4*Integer.parseInt(args[0]);
tw=4*Integer.parseInt(args[1]); fd=4*Integer.parseInt(args[2]);
ho=4+Integer.parseInt(args[3]); fo=args[4];
}
double[] pcm_datadrd = new double[44100*secs];
双[] pcm_datadr = 新双[44100];
for (int i=0; i<pcm_datadr.length; i++) {
pcm_datadr[i]=( 64*Math.sin((i/1837.5*(i*i/128))*Math.PI*2)/( 1+(Math.cos((4096) +64))+(i/256)) );
}
for(int x=0;x<(secs-1);x++){
for (int i=0;i<pcm_datadr.length;i++) {
pcm_datadrd[((int)(44100*x)+i)] = (double)
( 128*Math.sin((i/1837.5*(i*i/256))*Math.PI*2)/(1+(Math.cos((4096) +64))+((双)i/256)));
}
}
字节[] pcm_data = 新字节[44100*secs];
for (int i=0; i<pcm_data.length; i++) {
double fup=1+(fij*i/pcm_data.length);
pcm_data[i]=(byte)(pcm_datadrd[i]+(64*Math.sin((i/tw fup Math.cos(3+(i/fd))))+
32*Math.sin(5+( i/ho*fd)*Math.cos(i/(fd+tw)))));
}
AudioFormat frmt = new AudioFormat(44100, 8, 1, true, true);
AudioInputStream ais = new AudioInputStream(
new ByteArrayInputStream(pcm_data), frmt, pcm_data.length / frmt.getFrameSize()
);
尝试 {
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, new File(fo));
}catch(Exception e) { e.printStackTrace(); }
}
}
ABBA 'k vind't voor de kleintjes zielig die me laten MMA je, je vergeetk wat en huilt ook weet ik tranen
最好不要随机创建一个由随机音符组成的块 A 和 B 随机音符和做 (ABBA)+ 或 (AB)AB* 而是更好地应用量子理论的概念(自然界中的一切都是相互作用的,就像我们在这里看到的房子规则一样)在世界上的每一所房子里),正如你现在所理解的。
因此,就像一个元胞自动机,“生命游戏”,您可以每一步演奏您的“真实”音符,让“y 轴”表示音符编号和(请计算)音符的持续时间(沿'x轴')
出于随机原因,此声音的示例:http: //simple.ogena.net/Steel_Drum-Slap_Bas.mp3 来自生成的源: http ://simple.ogena.net/Steel_Drum-Slap_Bas.mid