Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Següent revisió | Revisió prèvia | ||
libgdx-so [2025/02/27 20:04] enric_mieza_sanchez creat |
libgdx-so [2025/03/02 23:26] (actual) enric_mieza_sanchez [So en libGDX] |
||
---|---|---|---|
Línia 1: | Línia 1: | ||
====== So en libGDX ====== | ====== So en libGDX ====== | ||
+ | |||
+ | Article de referència: | ||
Tenim dues opcions per tractar el so en libGDX: | Tenim dues opcions per tractar el so en libGDX: | ||
- | * La fàcil: emprant els [[https:// | + | * La fàcil: emprant els [[https:// |
- | * La complicada: emprant [[https:// | + | * La complicada: emprant [[https:// |
+ | |||
+ | Pots veure com utilitzar el sintetitzador de sons [[libGDX_JSYn|JSyn en libGDX]] en aquesta wiki. | ||
+ | |||
+ | {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 # | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ===== Exemple amb AudioDevice ===== | ||
+ | |||
+ | En aquest exemple generem una sinusoide (funció sinus, la ona més fonamental que hi ha) i l' | ||
+ | |||
+ | Al tocar la pantalla ('' | ||
+ | |||
+ | <code java> | ||
+ | |||
+ | float freq = 440.0f; | ||
+ | float sampleRate = 44100; | ||
+ | float step = 0.1f; // fragment minim de so | ||
+ | boolean sona = true; | ||
+ | boolean running = true; | ||
+ | AudioDevice audioDevice; | ||
+ | AudioThread audioThread; | ||
+ | |||
+ | public static float[] generaSinusoide(float frequency, float sampleRate, float durationInSeconds) { | ||
+ | int numSamples = (int) (sampleRate * durationInSeconds); | ||
+ | float[] samples = new float[numSamples]; | ||
+ | for (int i = 0; i < numSamples; i++) { | ||
+ | float t = i / sampleRate; | ||
+ | samples[i] = (float) Math.sin(2 * Math.PI * frequency * t); | ||
+ | } | ||
+ | return samples; | ||
+ | } | ||
+ | |||
+ | class AudioThread extends Thread { | ||
+ | @Override | ||
+ | public void run() { | ||
+ | // creem sinusoide (un sol cop) | ||
+ | float[] sineWave = generaSinusoide(freq, | ||
+ | |||
+ | while(running) { | ||
+ | if( sona ) | ||
+ | audioDevice.writeSamples(sineWave, | ||
+ | else { | ||
+ | // dormim una estona (la mateixa que el fragment d' | ||
+ | try { | ||
+ | Thread.sleep((long) (step*1000) ); | ||
+ | } catch(Exception e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void create() { | ||
+ | // ...elements GUI... | ||
+ | |||
+ | // Crear un dispositiu d' | ||
+ | audioDevice = Gdx.audio.newAudioDevice((int) sampleRate, true); | ||
+ | |||
+ | // creem i posem en marxa el thread d' | ||
+ | audioThread = new AudioThread(); | ||
+ | audioThread.start(); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void render() { | ||
+ | // ...activitat GUI... | ||
+ | |||
+ | // al detectar un touch apaguem o engeguem | ||
+ | if( Gdx.input.justTouched() ) { | ||
+ | sona = ! sona; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void dispose() { | ||
+ | // indiquem al thread de so que acabi | ||
+ | running = false; | ||
- | {{tag> #FpInfor #Dam #DamMp08 #DamMp08Uf3 # | + | // destruim objectes GUI |
+ | batch.dispose(); | ||
+ | image.dispose(); | ||
+ | // IMPORTANT: esperem a que acabi de sortir el thread d' | ||
+ | try { | ||
+ | audioThread.join(); | ||
+ | } catch(Exception e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||