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]
  • Hi,

    ich hab dir die Frequenzen ausgebessert, bzw. auf virtuelles Klavier umgestellt. (siehe hier)

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Dadurch wurde das Skript zwar länger, aber du hast mehr Töne zur Auswahl.

    LG
    Eal

  • 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: