The Simple Piano Simulator

  • wir sollten mal eine videokonferenz machen xD

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Koda?
    Das ist nur ein Formdesigner.

    Der kann soweit ich weiß kein GDI+

    GDI ist noch richtige Handarbeit. Nix mit grafischem Designer und Buttons hier hin und dort hinschieben

    das meine ich mit Koda hilft 0% weiter. Zwischen GDI und GDI+ ist übrigens (soweit ich weiß) auch ein unterschied.

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Sry, habe das "+" vergessen.

    Ja das ist ein Unterschied. GDI+ ist soweit ich weiß eine verbesserte und erweiterte Version von GDI

    No People is perfect ;)

    @Developer:
    Wir haben die Posts gleichzeitig geschrieben. War nur Zufall :P

  • was hält ihr von einer "Konferenz"? Dann könnten wir alles ruhig besprechen

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Habe erst Abends Zeit für "Konverenzen" ^^

    Davor ist Schule, Ausbildung, Arbeit...
    Der ganz normale Wahnsinn halt ;)

  • BadBunny, könntest du Developer und mir helfen? Das wär super! Ich üb jetzt mal ein bisschen GDI+...

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • @Soldier Wieso soll GDI+ nicht für Spiele geeignet sein? Schau mal in meine Signatur...

    Doch das stimmt in gewisser Weise schon. Sobald man etwas komplexeres machen möchte (mit vielen Draws) dann kann das vorallem in AutoIt, aber auch allgemein, sehr stockend werden.

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Zitat

    Doch das stimmt in gewisser Weise schon. Sobald man etwas komplexeres machen möchte (mit vielen Draws) dann kann das vorallem in AutoIt, aber auch allgemein, sehr stockend werden.


    Ach und woher weißt du das? Hast du das wirklich ausreichend getestet oder nur einmal ausprobiert und dann aufgegeben? :huh:
    Ich habe gerade ein Testprogramm geschrieben, mit dem ich bei 200+ beweglichen Kreisen die mit den Wänden kollidieren im Durchschnitt bis zu 25 FPS erreiche (und das obwohl mein Computer ganz sicher nicht mehr der Neueste ist)... Und dieses Script könnte man sogar noch weiter optimieren, z.B. durch Inline Assembler. Die Zeichenvorgänge sind nämlich alles andere als langsam im Vergleich zu den teilweise sehr komplexen Berechnungen von Physics Engines. Wenn man das auf Assembler auslagert bekommt man nochmal einen enormen Geschwindigkeitsboost. GDI+ ist nicht langsam, wenn man bedenkt was dort alles möglich ist (QuickDraw unterstützt nach meinem momentanen Wissensstand noch nicht einmal Antialiasing). Es ist durchaus möglich ein gutes Spiel mit ausreichender Performance in AutoIt mithilfe von GDI+ zu scripten (siehe UEZ's AutoIteroids). Wem das zu blöd/aufwendig ist, der kann sich ja OpenGL, Direct2D, DirectX, IrrLicht etc. zuwenden. Allerdings habe ich bisher gesehen, dass genau diese Personen dann keinen blassen Schimmer von den komplexen Berechnungen haben die in einem guten Spiel nötig sind (= schön anzusehen und ohne jede Funktion).

  • Ach und woher weißt du das? Hast du das wirklich ausreichend getestet oder nur einmal ausprobiert und dann aufgegeben?

    Ich bin keiner von denen, die unballanciert mit Draw Befehlen um sich werfen und sich dann bei geringer FPS wundern. Aber ein GDI+ Spiel rein in AutoIt mit hoher Komplexität und großer Spielmöglichkeit halte ich für schwer erreichbar.

    vorallem in AutoIt

    Inline Assembler

    meine Aussage bezog sich hauptsächlich auf AutoIt. Ist mir schon klar, dass man mit Einbindung von Assembler FPS retten kann. Aber trotzdem ist dass, wie du auch selbst in deinem Post geschrieben hast, viel aufwändiger das ganze in GDI+ zu machen, als gleich DirectX zu benutzen.


    Doch das stimmt in gewisser Weise schon. Sobald man etwas komplexeres machen möchte (mit vielen Draws) dann kann das vorallem in AutoIt, aber auch allgemein, sehr stockend werden.

    Ich glaube das war etwas unpräzise von mir formuliert. Besser: Spieleprogrammierung in GDI+ ist auffwändiger als wie mit dafür entwickelten Engines.

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Ist schon gut, aber:

    - Mit GDI+ lassen sich die hässliche Bilder erstzen, die Tasten könnten dann sogar aufleuchten
    - Der Ound ist bei machen Computern nicht zu hören

    MfG, campweb

  • Hier könnt ihr euch abgucken, wie ich die Tastatur via GDI+ gemacht hab.
    Es handelt sich um die Funktion _BitmapCreateKeyboard
    komplexer Synthesizer (Bass.dll)

    Des weiteren ist es nicht unbedingt nötig für jede Taste ein mp3 mitzuliefern.
    Via Bass.dll bestünde die Möglichkeit ein Sample ein paar Noten rauf und runter zu pitchen; so hätte man mit 2 Samples pro Oktave schon annehmbare Ergebnisse...
    (Auch Sustain wäre möglich, aber das ist wohl noch etwas zu früh ;))

    E

  • Hab das mal kurz probiert und hier ist eine kleine Starthilfe via Bass.dll die nur 1 Sample für die gesammte Oktave verwendet:

    EDIT: habs nochmal überarbeitet, nun 1 Sample für mehr als 2 Oktaven; das ist natürlich schon zu extrem, soll aber nur zeigen, wie es in etwa geht...

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include <Bass.au3>

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

    Global $aKeys = _CreateKeyMatrix("y|s|x|d|c|v|g|b|h|n|j|m|q|2|w|3|e|r|5|t|6|z|7|u|i|9|o|0|p", "|")

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

    HotKeySet("{ESC}", "_Exit")

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

    Global $hGui = GUICreate("Piano example", 200, 100)
    GUISetState()

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

    _BASS_Startup()
    _BASS_Init(0, -1, 44100, 0, "")

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

    Global $aSample[$aKeys[0] + 1]
    $aSample[0] = $aKeys[0]

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

    Global $fFreqOriginal = _Note2Freq(69)
    For $i = 1 To $aKeys[0]
    $aSample[$i] = _Bass_SampleLoad(False, @ScriptDir & "\Piano_c2.mp3", 0, 0, 12, 0)
    $aInfo = _BASS_SampleGetInfo($aSample[$i])
    $aInfo[0] = _Note2Freq(69 + $i - 13) * $aInfo[0] / $fFreqOriginal
    _BASS_SampleSetInfo($aSample[$i], $aInfo)
    Next

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

    Global $tKeys = DllStructCreate('byte[256];')
    Global $pKeys = DllStructGetPtr($tKeys)
    DllCall('user32.dll', 'int', 'GetKeyboardState', 'ptr', DllStructGetPtr($tKeys))
    Global $aToogle[$aKeys[0] + 1]
    For $i = 1 To $aKeys[0]
    $aToogle[$i] = BitAND(DllStructGetData($tKeys, 1, $aKeys[$i]), 0x0F)
    Next

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

    While 1
    DllCall('user32.dll', 'int', 'GetKeyboardState', 'ptr', DllStructGetPtr($tKeys))
    For $i = 1 To $aKeys[0]
    If BitAND(DllStructGetData($tKeys, 1, $aKeys[$i]), 0xF0) Then _Play($i, BitAND(DllStructGetData($tKeys, 1, $aKeys[$i]), 0x0F))
    Next
    Sleep(10)
    WEnd

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

    Func _Play($iNote, $bToogle)
    If $aToogle[$iNote] = $bToogle Then Return
    $aToogle[$iNote] = $bToogle
    Local $hChannel = _BASS_SampleGetChannel($aSample[$iNote], False)
    _BASS_ChannelPlay($hChannel, True)
    EndFunc ;==>_Play

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

    Func _Note2Freq($iNote, $iConcertPitch = 440)
    Return $iConcertPitch * 2 ^ (($iNote - 69) / 12)
    EndFunc ;==>_Note2Freq

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

    Func _CreateKeyMatrix($sKeys, $sDelim = "|")
    Local $aSplit = StringSplit($sKeys, $sDelim)
    Local $aKeys[$aSplit[0] + 1]
    $aKeys[0] = $aSplit[0]
    For $i = 1 To $aSplit[0]
    $aKeys[$i] = Asc(StringUpper($aSplit[$i])) + 1
    Next
    Return $aKeys
    EndFunc ;==>_CreateKeyMatrix

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

    Func _Exit()
    For $i = 1 To $aSample[0]
    _BASS_SampleFree($aSample[$i])
    Next
    _BASS_Free()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Nur rudimentär umgesetzt...
    gespielt werden kann mit den Tasten:

    Code
    2 3   5 6 7   9 0Q W E R T Z U I O P S D   G H JY X C V B N M

    Beenden mit ESC

    btw.: ich hab ein paar Bugs bei den _Bass_Sample-Funktionen entdeckt, also bitte die Bass.au3 aus dem angehängten Zip Archiv verwenden, bis ich das im Bass Thread gefixt hab...

    E