• 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
    [autoit]

    #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>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Const $bpm=240 ;schöne Speed (bei 240 ein Takt pro Sekunde)
    Const $takte=20

    [/autoit] [autoit][/autoit] [autoit]

    $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]

    [/autoit] [autoit][/autoit] [autoit]

    Init()
    Generate($toene,$takte)

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    Uninit()
    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func Uninit()
    For $x=0 To 11
    _SoundClose($sounds[$x])
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func NumberToTone($number)
    $number=Mod($number+7,7)
    If $number=0 Then $number=7
    Local $notenreihe="CDEFGAH"
    Return StringMid($notenreihe,$number,1)
    EndFunc

    [/autoit]

    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 :love:
    Vielleicht gefällt es euch auch :thumbup:

  • Ist witzig, kommen auch manchmal ganz witzige Melodien raus ^^
    Was mich stört ist das "knacken" beim öffnen der einzelnen Sound Datein, ich glaub das sollte verschwinden wenn man es über die Bass DLL macht und die Sachen alle einmal in den Speicher lädt und von da aufruft, bin mir aber nicht sicher obs dann besser ist.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Die Dinger werden nur einmal geladen ;)
    Ich vermute, dass die BASS dll nicht allzu viel bringt. Man müsste die Töne virtuell zusammenreihen und dann als eine Datei speichern und abspielen vermutlich. Ich wüsste aber nicht wie das so einfach geht