2012-09-23 115 views
1

我正在一個小程序中產生隨機旋律。到目前爲止,我有一系列音符和他們的頻率,程序從數組中挑選一個隨機元素並播放它的頻率。問題在於旋律「聽起來很糟糕」:就好像你坐在鋼琴前面,彈奏了隨機鍵。我需要一種算法來生成旋律,包括頻率和時間等等。我不需要任何細節,只需製作一段聽起來不錯的旋律即可。用於生成旋律的算法?

+1

你可能想看看[算法組成](http://en.wikipedia.org/wiki/Algorithmic_composition) –

+0

@gtgaxiola:是的,但它是很明顯,隨意選擇頻率不會產生大多數人會認爲美觀的結果。 –

+0

@NiklasB。我只是說,因爲算法組合在流行的意義上不被認爲是「好」的。 12音調技術是一個可愛的過程,但是一個平庸的最終結果。 – gtgaxiola

回答

4

使用現有的音樂(MIDI?)來訓練馬爾可夫模型或Markov chain 。您可能想要將輸入轉置爲相同的密鑰,例如C大調,未成年人。音調*持續時間可能必須被編碼(枚舉)爲單個維度(x * 7 * 5或x * 12 * 5)。 [x:=輸入範圍內的八度數,5 =持續時間,1 downto 1/16] 循環和變化的額外獎勵,但這會更難...

+0

解釋:Google是你的朋友,「寫一些代碼」也許http://sourceforge.net/projects/wakkerbot/ ?? – wildplasser

0

試着從相同的音階上演奏音符:) C大調,D小調等;) 甚至五聲音。

3

如果您想要的音樂是「通風」,從來沒有不和諧然後用五聲音調(即喜歡彈鋼琴的黑鍵)

例如: 間距選擇:

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

音高範圍: 3至5倍頻程(因爲一個八度向上或向下基本上加倍或減半的基本頻率的頻率)

注持續時間:

範圍從16thWhole Note

+0

完全是我尋找的東西:一個簡單的系統來產生一個永不和諧的旋律。 [雖然「注意時間」部分非常明顯,例如「從常見的(1/16,1/16及其一半,1/8,1/8及其一半......)中挑選一個隨機值] –

1

其他人試過這個。您可能想閱讀Richard MacDuff撰寫的文章'音樂和分形景觀'。

-1

ABBA數k vind't VOOR德kleintjes zielig死我laten MMA乙腦,流行性乙型腦炎 vergeetk笏恩huilt OOK weet IK tranen

這是最好不要隨意創造的散記塊A和正如你現在理解的那樣,更好地運用量子理論的概念(自然界中的一切相互作用,就像我們在這裏看到的家庭規則被應用在世界的房子裏一樣) 。

所以,像一個元胞自動機,'生命的遊戲',你可以每一步發揮你'真正'的音符,讓'y軸'的音符號碼和(請數)音符的持續時間adjacing trues沿 'x軸')這種聲音隨機性緣故

實施例: http://simple.ogena.net/Steel_Drum-Slap_Bas.mp3 從生成的源: http://simple.ogena.net/Steel_Drum-Slap_Bas.mid

+0

你能否清理一下你的答案?很難理解你的意思。 – Killah

0

進口java.io. ;
import javax.sound.sampled。
;
class 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;
     如果(args.length == 5){FIJ = 4 *的Integer.parseInt(參數[0]);
            TW = 4 *的Integer.parseInt (參數[1]); FD = 4 *的Integer.parseInt(參數[2]);
            HO = 4 +的Integer.parseInt(參數[3]); FO = ARGS [4];
     }            
      double [] pcm_datadrd = new double [44100 * secs];
      double [] pcm_datadr = new double [44100];
     對(INT I = 0;我< pcm_datadr.length;我++){
            pcm_datadr [I] =(64 * Math.sin((I/1837.5 *(I * I/128 ))* Math.PI * 2)/(1+(Math.cos((4096)+64))+(i/256)));
     }
     對(INT X = 0; X <(秒-1); X ++){
     的for(int i = 0;我< pcm_datadr.length;我++){
            pcm_datadrd [((int)的(44100 * X)+ 1)] =(雙)
           (128 * Math.sin((I/1837.5 *(I * I/256)) * Math.PI * 2)/(1+(Math.cos((4096)+64))+((double)i/256)));
           }      
     }
     字節[] PCM_DATA =新的字節[44100 *秒];
     對(INT I = 0;我< pcm_data.length;我++){
           雙FUP = 1 +(FIJ * I/pcm_data.length);
            PCM_DATA [I] =(字節)(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 =新的AudioInputStream(
           新ByteArrayInputStream進行(PCM_DATA),FRMT,pcm_data.length/FRMT。getFrameSize()
     ); AudioSystem.write(ais,AudioFileFormat.Type.WAVE,new File(fo));以及音頻編碼器。 catch(Exception e){e.printStackTrace();}};}}} }
     }}

+0

God保佑斯林格蘭德 –