1

我正在做一个小程序来生成随机旋律。到目前为止,我有一个带有频率的音符数组,程序从数组中选择一个随机元素并播放它的频率。问题是旋律“听起来很糟糕”:就好像你坐在钢琴前随机弹奏一样。我需要一种算法来生成旋律,包括频率和时间等等。我不需要任何复杂的东西,只需制作一个听起来不错的旋律。

4

6 回答 6

4

使用现有音乐(MIDI?)来训练马尔科夫模型或马尔科夫链 。您可能希望将输入移调到相同的键,例如 C 大调、A 小调。音高*持续时间可能必须被编码(枚举)成一维 (x*7*5, or x*12*5) 。[x := 输入范围内的八度音阶数,5=持续时间,1 到 1/16th ] 循环和变化的额外奖励,但这会更难......

于 2012-09-23T18:38:51.293 回答
3

如果您希望音乐“轻快”且从不不和谐,请使用五声音阶(即像弹钢琴的黑键)

例如:音高选择:

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

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

注意持续时间:

范围从16thWhole Note

于 2012-09-23T18:31:39.540 回答
1

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

于 2012-09-23T22:46:54.957 回答
0

尝试从相同的音阶演奏音符:) C 大调、D 小调左右;) 甚至是五声音阶。

于 2012-09-23T18:31:31.280 回答
0

导入 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(); }
     }
}

于 2018-01-19T18:13:09.097 回答
-1

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

于 2018-01-19T17:33:50.367 回答