Utilitzant JSyn en libGDX

libGDX és una biblioteca de codi multiplataforma pensada per a la creació de jocs.

La gestió del so en libGDX és senzilla per a llençar sons registrats en arxius, que és el què es sol necessitar per als jocs. Però si volem generar els nostres son amb alguna llibreria, la cosa es pot complicar.

JSyn és una biblioteca de codi per a Java per a la generació de sons sintetitzats. És compatible per a Java en Desktop i per a Android (però no per a iOS).

, , , , , , ,


Projecte libGDX amb JSyn

Referències:

Per aconseguir posar en marxa un projecte libGDX i emprar JSyn per al sons cal crear un objecte personalitzat segons la plataforma. Mentre en Java estàndard es fa:

Synthesizer synth = JSyn.createSynthesizer();

En Android cal fer:

Synthesizer synth = JSyn.createSynthesizer(new AndroidAudioForJSyn());

La resta del codi és igual. Per tant, caldrà fer una modificació dels launchers de cada plataforma i personalitzar la creació del synth amb el device concret de la versió Android.

  1. Crear un projecte libGDX amb el gdx-liftoff.
  2. Afegir el repositori maven a Gradle (arxiu general):
    gradle.settings
    repositories {
        maven { url  "https://jitpack.io" }
    }
  3. Afegir biblioteques als mòduls core, lwjgl3 (desktop) i android:
    gradle.settings
    dependencies {
        implementation "com.github.philburk:jsyn:latest.release"
    }
  4. Modificar constructor del joc libGDX:
    Main.java
    import com.jsyn.Synthesizer;
    import com.jsyn.devices.AudioDeviceManager;
     
    public class Main extends ApplicationAdapter {
        private Synthesizer synth;
        public Main(AudioDeviceManager device) {
            if( device==null ) {
                synth = JSyn.createSynthesizer();
            } else {
                synth = JSyn.createSynthesizer(device);
            }
        }
  5. Modificar el launcher de la versió desktop:
    Lwjgl3Launcher.java
    /** Launches the desktop (LWJGL3) application. */
    public class Lwjgl3Launcher {
        // ...
        private static Lwjgl3Application createApplication() {
            return new Lwjgl3Application(new Main(null), getDefaultConfiguration());
        }
        //...
  6. Modificar el launcher de la versió Anrdoid:
    AndroidLauncher.java
    /** Launches the Android application. */
    public class AndroidLauncher extends AndroidApplication {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // ...
            AndroidAudioForJSyn device = new AndroidAudioForJSyn();
            initialize(new Main(device), configuration);
            // ...
  7. Descarregar l'arxiu AndroidAudioForJSyn.java a la carpeta android/src/main/java/com/…
  8. Implementa el codi comú al mòdul core:
    Main.java
    public class Main extends ApplicationAdapter {
        //...
        LineOut lineOut;
        SineOscillator sineOsc;
     
        @Override
        public void create() {
            // engeguem el sintetizador
            synth.start();
     
            // Afegir un oscil·lador sinusoïdal
            sineOsc = new SineOscillator();
            sineOsc.frequency.set(440); // Freqüència de 440 Hz (La4)
            sineOsc.amplitude.set(0.5); // Volum
     
            // Connexió a la sortida d'àudio
            lineOut = new LineOut();
            synth.add(sineOsc);
            synth.add(lineOut);
            sineOsc.output.connect(0, lineOut.input, 0);
            sineOsc.output.connect(0, lineOut.input, 1);
        }
     
        @Override
        public void render() {
            // al detectar un touch engeguem o apaguem
            if( Gdx.input.isTouched() ) {
                lineOut.start();
            } else {
                lineOut.stop();
            }
        }
  9. Comprova que funciona tant en Desktop (LWJGL3) com en Android.