Hallo Besucher, der Thread wurde 1,1k mal aufgerufen und enthält 6 Antworten

letzter Beitrag von ZeHa am

eigene Musikroutine - laeuft, aber nicht ganz perfekt

  • Servus,


    ich habe mich mal an einer eigenen Musikroutine versucht. Man mag sich vielleicht fragen, warum, denn es gibt doch schon so viel fertiges, aber ich moechte das nicht zur Diskussion werden lassen, es ging mir ganz einfach mal drum, das selbst zu machen, auch um dabei etwas zu lernen. Und wie es aussieht, gibt es durchaus einiges, was ich dabei noch lernen muss...


    Kurz zum Prinzip: Die Musik besteht aus einer Liste von Frequenzen, welche einfach fuer die drei Stimmen Stueck fuer Stueck eingelesen und in die entsprechenden Register geschrieben werden. Sollte eine Frequenz $FFFF sein, so wird ueberhaupt nichts gemacht, somit kann der Ton noch etwas ausklingen. Sollte eine Frequenz geschrieben worden sein, wird die Wellenform samt Gate-Bit geschrieben. Im naechsten Frame (jeweils durch IRQ ausgeloest) wird das Gate-Bit wieder geloescht, sodass der Ton direkt ausklingt. Dann wird eine gewisse Anzahl an Frames ueberhaupt nichts gemacht, bis es wieder soweit ist, dass die naechsten Noten gespielt werden sollen, und das ganze beginnt von vorn. Also eigentlich eine ganz simple Sache.


    Das hat erstmal gar nicht so schlecht funktioniert, aber ich habe festgestellt, dass die Musik nicht 100% rund zu laufen scheint, sprich, es gibt ab und zu Toene, die scheinbar einen Tick spaeter oder frueher kommen. Das ganze war zum Teil nur minimal bemerkbar, aber es war definitiv da. Also habe ich ein wenig mehr rumexperimentiert, z.B. stable IRQs verwendet usw, aber irgendwie hat auch das nicht geholfen. Ich habe dann noch die Stelle, wo die Gate-Bits gesetzt und geloescht werden teilweise etwas herumgeschoben und siehe da, ich konnte zumindest Unterschiede feststellen. Leider laesst mein aktueller Code aber nicht wirklich andere Stellen zu, daher konnte ich das auch nicht so lassen. Habe dann noch die Idee gehabt, die Stimme kurz vorm Setzen der Wellenform + Gate-Bit einfach komplett abzuschalten, und siehe da, das ist bisher das beste Ergebnis. Es klingt nun 100% stabil.


    Jetzt habe ich nur das Problem, dass ich, sobald ich ein anderes Tempo einschalte (sprich einfach eine andere Anzahl an Warte-Frames verwende), wieder extreme Unsauberkeiten bekomme. Moeglicherweise ist das alles also nur Zufall, dass es gerade in meinem verwendeten Tempo funktioniert?


    Ich denke es ist am besten wenn ich den Code hier poste, vielleicht hat ja jemand einen Tip fuer mich. Vielleicht mache ich auch grundsaetzlich etwas falsch mit dem ganzen Gate-Bit-Zeugs usw. Ich hoffe es kann mir jemand weiterhelfen :)


    Hier der Code:

  • Sollte eine Frequenz geschrieben worden sein, wird die Wellenform samt Gate-Bit geschrieben. Im naechsten Frame (jeweils durch IRQ ausgeloest) wird das Gate-Bit wieder geloescht, [...]

    Nur so ein Gedanke: damit "grätschst" Du dem SID natürlich immer in den "ADS"-Teil der ADSR-Kurve rein. Je nach gewählter Länge von Attack- und Decaytime kommt er also nie dazu, die Sustain-Lautstärke abzuspielen und dann gibt's evtl. einen holprigen Übergang nach Release.


    Ich würde umgekehrt eher Gate bis kurz vor Ende der Note anstehen lassen, und ggfs. Attack auf 0, Dekay auf die gewünschte Ausklingzeit, Sustain auf 0 und Release ebenfalls auf 0 setzen. Probier das doch mal aus.

  • Okay stimmt das ist eine gute Idee. Meine ADSR sieht ja wie folgt aus: 00F8, da koennte ich also einfach mal stattdessen z.B. 08F0 nehmen oder so.


    EDIT: Oder 0800 wie Du sagst. Ich probiere es gerade mal aus.

  • Wollte mich hier mal rueckmelden, wie es aussieht war es wirklich der "ADSR-Bug" den @M. J. genannt hat. Wenn ich drauf achte dass ich immer die korrekte Anzahl Frames abwarte, dann klingt die Musik immer sauber, egal bei welchem Tempo. Vielen Dank :)