Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Synthé pour Android

12 Mars 2017 , Rédigé par Ghislain Martin Publié dans #SYNTHES, #DEVELOP, #ANDROID, #STUDIO

Coucou !

Pour ceux qui voudraient créer un petit synthé bas niveau pour les tablettes et smartphones, voici un nouvel article, qui complétera la série commencée avec delphi, java, csharp. Le code ci-dessous fonctionne pour moi, sous Android Studio, que ce soit via un émulateur comme sur mon smartphone connecté en USB. Comme d'habitude, ce code sert juste à générer un son sinusoïdal infini. A vous de modifier l'alimentation des octets pour transformer cela en qqch d'un peu plus abouti. Je me suis basé sur plusieurs snippets trouvés sur le web.

 

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

public class MainActivity extends Activity {

    Thread t;
    int sr = 44100;
    boolean isRunning = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // start a new thread to synthesise audio
        t = new Thread() {
            public void run() {
                // set process priority
                setPriority(Thread.MAX_PRIORITY);
                int buffsize = AudioTrack.getMinBufferSize(sr,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
                // create an audiotrack object
                AudioTrack audioTrack = new AudioTrack(
                        AudioManager.STREAM_MUSIC, sr,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        buffsize,
                        AudioTrack.MODE_STREAM);
                short samples[] = new short[buffsize];
                int amp = 10000;
                double twopi = 8. * Math.atan(1.);
                double fr = 440.f;
                double ph = 0.0;
                // start audio
                audioTrack.play();
                // synthesis loop
                while (isRunning) {

                    for (int i = 0; i < buffsize; i++) {
                        samples[i] = (short) (amp * Math.sin(ph));
                        ph += twopi * fr / sr;
                    }
                    audioTrack.write(samples, 0, buffsize);
                }
                audioTrack.stop();
                audioTrack.release();
            }
        };
        t.start();
    }
    public void onDestroy(){
        super.onDestroy();
        isRunning = false;
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t = null;
    }
}

Partager cet article

Commenter cet article