Nur was generelles zu Java:
Du willst ja vermutlich real-time Ausgabe des Sounds haben (also MIDI Keyboard spielen und hören), da würde ich behaupten, dass Java nicht unbedingt die beste Wahl ist.
Problematisch sehe ich da, dass der garbage collector ja jederzeit anlaufen kann, und wenn er das tut während du gerade deine samples für die nächste Ausgabe berechnest, dann bekommste Knackser und so. Da müsstest du ggf. gucken ob man den garbage collector auch einfach abschalten kann für die Zeit wo du Samples berechnest.
Auch weiß ich nicht, ob der Java overhead was Zugriff auf Felder und Objekte angeht, sowie Methoden aufrufe, nicht etwas zu hoch ist. Zwar sollten float-Berechnungen und mathematisches vermutlich vom Just-in-Time-Compiler beschleunigt werden, aber wenns ums Handling von Objekten und Methoden-Aufrufe geht, da kann der JIT nicht mehr viel machen.
Ich würde eher C++ nehmen, da hast du mehr Kontrolle darüber was wieviel CPU Zeit frisst. Aufpassen, dass die Rechenzeit reicht, musst du in jedem Jall, nur bei Java wirst du (definitiv) schneller an Grenzen stoßen. Zum herum experimentieren sollte Java evtl. sogar reichen, ich hab da keine Erfahrung mit was Synth-Programmierung angeht. Aber zum "number crunching", was ja ein Softsynth macht, ist Java eigentlich nicht direkt geeignet.
Diverse Berechnungen hin und wieder sind auch ganz hilfreich. z.B. wieviel Rechenzeit man pro Sample zur Verfügung hat usw. Wenn du z.B. mit 48kHz arbeitest, dann hast du 1 / 48000 Sekunden Zeit für ein Sample. Das sind 0.2083 Millisekunden, und 20.83 Mikrosekunden. Wenn du dann real-time fähige Puffergrößen nimmst, so im Bereich von 128-256 Samples,
dann hast du 2666 bis 5333 Mikrosekunden (also rund 2.6 bis 5.3 Millisekunden) Zeit diese zu berechnen. In der Zeit solltest du möglichst auch keine Systemaufrufe machen (also so Dinge wie Speicher reservieren oder freigeben, oder Ein/Ausgaben).