Moinz!
Heute stell ich euch meinen MusicMaker a la DJ 3000 vor. (Der Musikunterricht war doch nicht ganz unnötig :D)
Heute schon länger die Idee mal frische neue unbenutzte Melodieen mit einem Programm durch Zufall erstellen zu lassen, und nun:
mein MusicMaker, nur ein kleines Spaßskript, das euch tatsächlich ziemlich hörbare Melodien vorspielt. Die Töne hab ich fein säuberlich mit dem Tongenerator (2) von Audacity gemacht.
Wenn ihr ein "Song" speichern wollt müsst ihr allerdings den Sound-Output (Stereomix) mit schneiden.
Es kommen auch Akkorde vor. Ich hab es standardmäßig auf 20 Takte gestellt (bei der voreingestellten Geschindigkeit 20 Sekunden) Ihr könnt aber die Taktanzahl und Geschwindigkeit sehr leicht oben verstellen. (Happy testing)
Ich hoffe es bereitet euch ein wenig Freude!
Viel Spaß damit, ich hoffe der Code ist nicht zu unleserlich
Code:
Spoiler anzeigen
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <Math.au3>
#include <Misc.au3>
#include <Sound.au3>
Const $bpm=240 ;schöne Speed (bei 240 ein Takt pro Sekunde)
Const $takte=20
$wait=500/($bpm/60) ;bei 120 beats per minute sind 2/4 noten eine Sekunde
Dim $toene[1] ;[0]=Anzahl, [1...]="1C#8": <Tonanzahl>[<Ton><Vorzeichen><Tongröße 1/x>]... Cb4
$toene[0]=0 ;1/8 ist das kürztmögliche, langsamstes: 1/1
Dim $sounds[12]
Init()
Generate($toene,$takte)
$warten=0
Do
For $x=1 To $toene[0]
$warten=0
$tonzahl=StringLeft($toene[$x],1)
For $i=0 To $tonzahl-1
$warten=_Max(Number(Play(StringMid($toene[$x],2+$i*3,3))),$warten)
Next
$warten=$wait/($warten/8)
Sleep($warten)
Next
Until MsgBox(4,"Wiederholung","Nocheinmal abspielen?")<>6
Uninit()
Exit
Func Play($ton) ;C 4
Local $plnum=-1
Switch (StringLeft($ton,2))
Case "C "
$plnum=0
Case "C#"
$plnum=1
Case "D "
$plnum=2
Case "D#"
$plnum=3
Case "E "
$plnum=4
Case "F "
$plnum=5
Case "F#"
$plnum=6
Case "G "
$plnum=7
Case "G#"
$plnum=8
Case "A "
$plnum=9
Case "A#"
$plnum=10
Case "H "
$plnum=11
EndSwitch
_SoundPlay($sounds[$plnum])
Return StringRight($ton,1)
EndFunc
Func Init()
Local $endung="wav"
$sounds[0]=_SoundOpen(@ScriptDir&"\SFX\C ."&$endung)
$sounds[1]=_SoundOpen(@ScriptDir&"\SFX\C#."&$endung)
$sounds[2]=_SoundOpen(@ScriptDir&"\SFX\D ."&$endung)
$sounds[3]=_SoundOpen(@ScriptDir&"\SFX\D#."&$endung)
$sounds[4]=_SoundOpen(@ScriptDir&"\SFX\E ."&$endung)
$sounds[5]=_SoundOpen(@ScriptDir&"\SFX\F ."&$endung)
$sounds[6]=_SoundOpen(@ScriptDir&"\SFX\F#."&$endung)
$sounds[7]=_SoundOpen(@ScriptDir&"\SFX\G ."&$endung)
$sounds[8]=_SoundOpen(@ScriptDir&"\SFX\G#."&$endung)
$sounds[9]=_SoundOpen(@ScriptDir&"\SFX\A ."&$endung)
$sounds[10]=_SoundOpen(@ScriptDir&"\SFX\A#."&$endung)
$sounds[11]=_SoundOpen(@ScriptDir&"\SFX\H ."&$endung)
EndFunc
Func Uninit()
For $x=0 To 11
_SoundClose($sounds[$x])
Next
EndFunc
Func Generate(ByRef $toene,$takte)
Local $durmoll=Random(0,1,1)
ConsoleWrite(_Iif($durmoll,"Moll","Dur")&@CRLF)
Local $tones="1C 1"
Local $lastakk="C E G ",$lltone,$lldiff=0
For $x=1 To $takte
Local $t=0
While $t<>1
Local $toze=0
While $toze=0 Or $t+1/$toze>1
$toze=2^Random(1,3,1)
WEnd
$t+=1/$toze
$lltone=$tones
If ($x=1 And $t=1/$toze) Or ($x=$takte And $t=1) Then
$tones="C "&$toze
Else
Local $last=ToneToNumber(StringTrimLeft($tones,1)),$next,$akkt
Do
$akkt=StringMid($lastakk,1+Random(0,2,1)*2,2)
$next=ToneToNumber($akkt)
Until $lldiff+Abs($next-$last)>0
$tones=$akkt&$toze
EndIf
$lldiff=Abs(ToneToNumber(StringTrimLeft($lltone,1))-ToneToNumber($tones))
If $t-1/$toze=0 Then
Local $akk[3]
Select
Case $x=1
$akk[0]="C "
Case $x=2
$akk[0]="F "
Case $x=3
$akk[0]="G "
Case Else
$akk[0]=NumberToTone(Random(1,7,1))&" "
EndSelect
$akk[1]=AddHalftone($akk[0],_Iif($durmoll,3,4))
$akk[2]=AddHalftone($akk[1],_Iif($durmoll,4,3))
$lastakk=$akk[0]&$akk[1]&$akk[2]
$tones&=$akk[0]&"1"&$akk[1]&"1"&$akk[2]&"1"
$tones="4"&$tones
Else
$tones="1"&$tones
EndIf
_ArrayAdd($toene,$tones)
$toene[0]+=1
WEnd
Next
EndFunc
Func AddHalftone($note,$sprung)
Local $i
For $i=1 To $sprung
If StringRight($note,1)="#" Then
$note=NumberToTone(ToneToNumber($note)+1)&" "
Else
If StringLeft($note,1)="E" Then
$note="F "
ElseIf StringLeft($note,1)="H" Then
$note="C "
Else
$note=StringLeft($note,1)&"#"
EndIf
EndIf
Next
Return $note
EndFunc
Func ToneToNumber($ton)
Local $notenreihe="CDEFGAH",$x
For $x=1 To 7
If StringMid($notenreihe,$x,1)=StringLeft($ton,1) Then Return $x
Next
EndFunc
Func NumberToTone($number)
$number=Mod($number+7,7)
If $number=0 Then $number=7
Local $notenreihe="CDEFGAH"
Return StringMid($notenreihe,$number,1)
EndFunc
mfg
20 Downloads der alten Version schon
EDIT:
UPDATE:
Ich hab ein paar Feinabstimmungen gemacht und die zusätzliche "Version" nocheinmal upgeloadet. Die neue Version soll (und tut auch) sich so ähnlich (oder genauso) wie 8 bit Musik anhören. Ich liebe 8 Bit musik
Vielleicht gefällt es euch auch