Beep-Tonleiter UDF

  • Ist eine einfache, aber lustige UDF. Einfach den Ton, Dauer und Anzahl angeben und schon kann man kleine Musikstücke aus dem Systemlautsprecher ausgeben, wie z.B. mit "Alle meine Entchen":

    Spoiler anzeigen
    [autoit]

    #Include <_beepton.au3>
    _beepton("c",500)
    _beepton("d",500)
    _beepton("e",500)
    _beepton("f",500)
    _beepton("g",1000,2)
    _beepton("a",500,4)
    _beepton("g",1500)
    _beepton("a",500,4)
    _beepton("g",1500)
    _beepton("f",500,4)
    _beepton("e",1000,2)
    _beepton("d",500,4)
    _beepton("c",2000)

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

    _beepton("c2",500)
    _beepton("d2",500)
    _beepton("e2",500)
    _beepton("f2",500)
    _beepton("g2",1000,2)
    _beepton("a2",500,4)
    _beepton("g2",1500)
    _beepton("a2",500,4)
    _beepton("g2",1500)
    _beepton("f2",500,4)
    _beepton("e2",1000,2)
    _beepton("d2",500,4)
    _beepton("c2",2000)

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

    _beepton("c3",500)
    _beepton("d3",500)
    _beepton("e3",500)
    _beepton("f3",500)
    _beepton("g3",1000,2)
    _beepton("a3",500,4)
    _beepton("g3",1500)
    _beepton("a3",500,4)
    _beepton("g3",1500)
    _beepton("f3",500,4)
    _beepton("e3",1000,2)
    _beepton("d3",500,4)
    _beepton("c3",2000)

    [/autoit]

    Funktion _beepton(Ton[,Dauer[,Anzahl]])

    Ton - Ton angeben (z.B. "c", "e", "f#", "a#")
    Dauer - Dauer des Tons (Standard = 1000[1s])
    Anzahl - Wie oft dieser Ton abgespielt wird. (Standard = 1)

    _beepton UDF:

    Spoiler anzeigen
    [autoit]

    #include-once
    Func _beepton($v_ton, $i_dauer = 1000, $i_anzahl = 1)
    Local $frequenz = -1, $v_ton2 = $v_ton, $i_oktave = StringRight($v_ton,1)
    Local $aToene[17][2] = [["c", 262],["c#",277],["db",277],["d",294],["d#",311],["eb",311],["e", 330],["f", 349],["f#",370],["gb",370],["g", 392],["g#",415],["ab",415],["a", 440],["a#",466],["b",466],["h", 494]]
    If StringIsInt($i_oktave) Then $v_ton2 = StringTrimRight($v_ton,1)
    If Not StringIsInt($i_oktave) Then $i_oktave = 1
    For $i = 0 To 16
    If $v_ton2 = $aToene[$i][0] Then $frequenz = $aToene[$i][1]
    Next
    If $frequenz = -1 Then
    Return 0
    SetError(1)
    EndIf
    $beepton = ($frequenz*2^$i_oktave)/2
    For $i = 1 To $i_anzahl
    Beep($beepton,$i_dauer)
    Next
    Return 1
    EndFunc

    [/autoit]

    UPDATE: Geht jetzt bis zu drei Tonleitern hoch! Einfach die Zahl der Tonleiter davorsetzen, also z.B. "2c","2f#","3h","3g#"
    UPDATE: Geht jetzt (rein theoretisch) bis zu 7 Tonleitern hoch; Script drastisch gekürzt; Der Anhang "b" wird unterstützt;
    Gibt bei Misserfolg(z.B. durch falsche angaben) 0 zurück und setzt @Error auf 1; Tonleiter wird wie folgt angegeben:

    [autoit]

    _beepton("a") ; normal
    _beepton("a1") ;normal
    _beepton("a3") ;3 Oktaven höher
    _beepton("ab2") ;2 Oktaven höher + einen Halbton tiefer
    _beepton("f#") ;Einen Halbton höher
    _beepton("fb") ;Fehler, da nicht unterstützt

    [/autoit]

    Dateien

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

    5 Mal editiert, zuletzt von Cartan12 (4. Februar 2010 um 11:00)

  • Wenn noch mehr Oktaven oder auch das Halbtondekrement "b" hinzukommt wird es vielleicht bisschen riesig im Code wenn man da wie bisher auf eine Look-Up Table zurückgreift.
    Vielleicht wärs eine Möglichkeit die Frequenzen zu berechnen statt zu vorher einzutragen.
    Hab dir mal einen Ansatz gebastelt - vielleicht kannst du damit ja etwas anfangen:

    Spoiler anzeigen
    [autoit]

    _beepton("c",500)
    _beepton("d",500)
    _beepton("e",500)
    _beepton("f",500)
    _beepton("g",1000,2)
    _beepton("a2",500,4)
    _beepton("g",1500)
    _beepton("a2",500,4)
    _beepton("g",1500)
    _beepton("f",500,4)
    _beepton("e",1000,2)
    _beepton("d",500,4)
    _beepton("c",2000)

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

    Func _beepton($v_ton, $i_dauer = 1000, $i_anzahl = 1, $iKammerton = 440)
    Local $iInkr = 0, $cTon = StringLeft($v_ton, 1), $X = -1
    Local $iFreq
    Local $aToene[7][2] = [["a", 0],["b", 2],["c", 3],["d", 5],["e", 7],["f", 8],["g", 10]]

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

    For $i = 0 To 6
    If $cTon = $aToene[$i][0] Then $X = $aToene[$i][1]
    Next
    If $X = -1 Then Return SetError(1, 0, False)

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

    Switch StringLen($v_ton)
    Case 1

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

    Case 2
    Switch StringMid($v_ton, 2, 1)
    Case '#'
    $iInkr = 1
    Case 'b'
    $iInkr = -1
    Case Else
    $iKammerton *= 2^(Int(StringMid($v_ton, 2, 1))-1)
    EndSwitch

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

    Case 3
    $iKammerton *= 2^(Int(StringMid($v_ton, 2, 1))-1)

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

    Switch StringMid($v_ton, 3, 1)
    Case '#'
    $iInkr = 1
    Case 'b'
    $iInkr = -1
    Case Else
    Return SetError(3, 0, False)
    EndSwitch
    Case Else
    Return SetError(2, 0, False)
    EndSwitch

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

    $iFreq = $iKammerton*(2^(($X+$iInkr)/12))

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

    For $i = 1 To $i_anzahl
    Beep($iFreq,$i_dauer)
    Next
    EndFunc ;==>_beepton

    [/autoit]
  • UPDATE siehe POST#1

    Hab eure Tipps berücksichtigt, danke Leute :thumbup:

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • oh je, das ist zwar schon etwas abgedreht, aber da stehe ich total drauf :D

    Mal schauen was man so dafür zusammenkomponieren kann und dann ordentlich :rock: