Synthé pour Android
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; } }
Commenter cet article