用于生成旋律的算法?

时间:2012-09-23 18:28:30

标签: algorithm

我正在一个小程序中生成随机旋律。到目前为止,我有一系列带有频率的音符,程序从数组中选取一个随机元素并播放其频率。问题是旋律“听起来很糟糕”:好像你坐在钢琴前面并弹奏随机键。我需要一种算法来生成一个带有频率和时序的旋律等等。我不需要任何精心设计,只需制作听起来不错的旋律。

6 个答案:

答案 0 :(得分:4)

使用现有音乐(MIDI?)训练马尔可夫模型或Markov chain 。您可能希望将输入转置为相同的密钥,例如C大调,A小调。可能必须将音高*持续时间编码(枚举)为单个维度(x * 7 * 5或x * 12 * 5)。 [x:=输入范围内的八度音程数,5 =持续时间,1 downto 1/16]   循环和变化的额外奖励,但这将更难......

答案 1 :(得分:3)

如果你想让音乐“通风”而且从不和谐,那就使用五声音阶(即喜欢弹钢琴的黑键)

例如: 音高选择:

C#,D#,F#,G# or A#

投球范围: 3到5个八度(因为八度音向上或向下基本上是你的基频频率加倍或减半)

注意持续时间:

16thWhole Note

的范围

答案 2 :(得分:1)

其他人试过这个。您可能想阅读Richard MacDuff撰写的文章“音乐和分形景观”。

答案 3 :(得分:0)

尝试以相同比例演奏音符:) C大调,D小调左右;) 甚至是五声音响。

答案 4 :(得分:0)

import java.io. ;
导入javax.sound.sampled。
;
类Me {
public static void main(String [] args){
int fij = 128; int tw = 64; int fd = 2048;
int secs = 128; String fo =“Me.wav”; int ho = 8;
if(args.length == 5){fij = 4 * Integer.parseInt(args [0]);
tw = 4 * Integer.parseInt(args [1]); FD = 4 *的Integer.parseInt(参数[2]);
ho = 4 + Integer.parseInt(args [3]); FO = ARGS [4];
} double [] pcm_datadrd = new double [44100 * secs];
double [] pcm_datadr = new double [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+(数学。 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))+((double)i / 256)));
}
}
byte [] 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(新的ByteArrayInputStream(pcm_data),frmt,pcm_data.length / frmt。 getFrameSize()
);
试试{
AudioSystem.write(ais,AudioFileFormat.Type.WAVE,new File(fo));
} catch(Exception e){e .printStackTrace(); }
}

答案 5 :(得分:-1)

  

ABBA' v vind' t voor de kleintjes zielig die me laten MMA je,je   vergeetk wat en huilt ook weet ik tranen

最好不要随机创建随机音符和随机音符A和Do(ABBA)+或(AB)AB *的块A,但更好地应用量子理论的概念(自然界中的一切都会像我们一样交互正如你现在所理解的那样,这里看到的房屋规则适用于世界各地的房屋。

因此,细胞自动机,生命游戏'你可以,每一步,发挥你真实的'注意,让'y轴''音符编号和(请计算)音符的持续时间(沿着' x轴'相邻的音符)

随机发出此声音的示例: http://simple.ogena.net/Steel_Drum-Slap_Bas.mp3 来自生成的来源: http://simple.ogena.net/Steel_Drum-Slap_Bas.mid