Hallo Besucher, der Thread wurde 799 mal aufgerufen und enthält 5 Antworten

letzter Beitrag von Zirias/Excess am

Kurzen Pffff-Sound mit SID generieren

  • Hey Cracks,


    ich programmiere gerade just for Fun einen Krakout-Klon. Wenn ein Stein zerstört wird, möchte ich gerne einen Pffff-Sound abspielen. Ich hoffe, ihr wisst, was ich meine. Hab mal versucht, mich da reinzuarbeiten mit einem kleinen Basic-Programm, aber so ganz verstehen kann ich es noch nicht. Ich habe erstmal das Register 4 des SID auf Rauschen gestellt (128+1) und ein Rauschen erzeugt. Das will aber nicht aufhören. Klar, ich kann das Register nach einer kurzen Warteschleife wieder auf Null stellen. Aber geht das nicht anders? Perfekt wäre ein schnelles Ausklingen. Was schlagt ihr vor? Mein Spiel läuft in einem Raster-IRQ-Handler. Vielen Dank im Voraus für Antworten.

  • Hexworx Wow, sehr merkwürdig, dass das so funktioniert. Allerdings würde ich den Sound gerne ein Mü kürzer haben. Aber es ist wurscht, was ich in das untere Nibble von 6 schreibe - der Sound bleibt gleich lang (obwohl POKE S+6,0 ja eigentlich ein schnelles Ausklingen bedeuten müsste). Und wenn ich 8 in 5 schreibe statt 9 ist der Sound wiederum zu kurz. Hast du irgendwelche weiteren Empfehlungen? Würde mich freuen.

  • Da ich deinen Code nicht kenne, kann ich nur raten:


    Du solltest/musst das Register 4/den Sound laufend löschen (also nullen) und dann mit (in deinem Falle) 129 auslösen. Machst du das?

  • Hallo Hexworx. Ja, das mache ich jetzt. Nach ein bisschen Herumspielen mit dem oberen Nibble von Register 5 bin ich jetzt einigermaßen zufrieden. Mein Code ist wie folgt:

    Danke, dass du mir geholfen hast. Da wäre ich nie drauf gekommen. Ehrlich gesagt verstehe ich die Wirkungsweise dieser Werte nicht besonders (obwohl ich eigentlich musikalisch bin).


    Jetzt brauche ich nur noch einen Bounce-Sound für das Abprallen des Balls an den Wänden. ;-)

  • Einfach nur einmal Werte im SID setzen schränkt dich in den Gestaltungsmöglichkeiten sehr ein. Ein wirklich guter Soundeffekt wird während dem Abspielen meistens was ändern -- zuallermindest Gate (in deinem Code oben "missbrauchst" du Decay zum ausklingen, verwendest also nur die Hälfte der möglichen ADSR Parameter), oft auch Frequenz, Pulsweite, Filter, etc.


    In der Regel geht man das ähnlich an wie bei einem Musik-Player, nur ohne Pattern und dergleichen: man überlegt sich ein Datenformat, in dem abgelegt ist, was beim Abspielen passieren soll, und schreibt eine Routine, die einmal pro Frame aufgerufen wird und schaut, was gerade am SID zu tun ist.


    Kleines Beispiel: Vor einiger Zeit brauchte ich einen Sound für einen "Tastaturklick", den habe ich mit folgenden simplen Daten umgesetzt:

    Code
    1. clicksound: .byte $00, $0f
    2.             .byte $01, $24
    3.             .byte SFX_FREQ, $00, $10
    4.             .byte SFX_WAVE, $81
    5.             .byte $0
    6.             .byte SFX_WAVE, $80
    7.             .byte SFX_END

    SFX_* sind dabei definierte Konstanten als "Befehl" an den Player. Das Format hier ist recht einfach, die erste Zeile setzt ADSR für den hard restart, die zweite Zeile ADSR für den eigentlichen Sound, danach kommen Zeilen mit Kommandos wie Frequenz setzen, Welleform setzen, oder mit nur einer Zahl, die sagt, hier so viele Frames warten. Man muss eben eine Player-Routine bauen, die einmal pro Frame diese Daten liest und die entsprechende Aktion auf dem SID ausführt :)


    Du kannst da beliebig "ausflippen" und abgefahrenen Kram einbauen (Befehle für Ringmod usw?), oder recht simpel bleiben, aber damit irgendwas vernünftiges rauskommt behaupte ich um einen Play-Routine kommst du nicht herum.