IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Générer un son


Sujet :

Android

  1. #1
    Membre habitué Avatar de linked
    Profil pro
    Développeur Android
    Inscrit en
    Mai 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Mai 2008
    Messages : 88
    Points : 133
    Points
    133
    Par défaut Générer un son
    Bonjour,

    Existe t'il un moyen de jouer un son sans utiliser de fichiers ?
    Genre un son qui va de 1hz à 1000hz sur 10s et qui incremente de x hz, le tout controllé par un bout de code.

    J'ai vu Tonegenerator mais on dirait que l'on ne peut pas choisir la frequence que l'on veut.
    Applications et jeux gratuits sur http://www.kamaxandroid.com

  2. #2
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Hello,

    Tu peux faire ça avec en créant une SourceDataLine et en lui envoyant directement les octets correspondant à la forme d'onde que tu veux générer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    float sampleRate = 44100;
    double frequency = 2000;
    double volume = 0.5;
    double duration = 2.0;
     
    AudioFormat af = new AudioFormat( sampleRate, 16, 1, true, false );
    SourceDataLine sdl = AudioSystem.getSourceDataLine( af );
    sdl.open( af );
    sdl.start();
    for( int i = 0; i < duration * sampleRate; i++ ) {
        double angle = i * frequency / sampleRate * 2.0 * Math.PI;
        short sample = (short) (32767 * Math.sin( angle ) * volume);
     
        sdl.write( new byte[] { (byte) (sample & 0xFF), (byte) ((sample & 0xFF00) >> 8) }, 0, 2 );
    }
    sdl.drain();
    sdl.stop();
    sdl.close();
    Je te laisse le soin de remplacer le calcul de angle et sample par la formule mathématique qui te convient.

  3. #3
    Membre habitué Avatar de linked
    Profil pro
    Développeur Android
    Inscrit en
    Mai 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Mai 2008
    Messages : 88
    Points : 133
    Points
    133
    Par défaut
    Merci de ton aide mais je n'arrive pas à l'integrer dans un projet, eclipse me trouve des erreurs avec sourcedataline et audioformat
    Applications et jeux gratuits sur http://www.kamaxandroid.com

  4. #4
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Hum, désolé j'ai répondu un peu vite, ce code est valable sous Java SE mais il manque javax.sound sous Android.

    Sous Android il faut faire ça avec AudioTrack :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 1024, AudioTrack.MODE_STREAM);
    audioTrack.play();
    audioTrack.write(data, 0, length);

  5. #5
    Membre habitué Avatar de linked
    Profil pro
    Développeur Android
    Inscrit en
    Mai 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Mai 2008
    Messages : 88
    Points : 133
    Points
    133
    Par défaut
    J'ai trouvé un morceau de code avec audiotrack qui marche,le seul probleme est que si je veut le jouer en continu ça fait tic tic tic à chaque boucle.
    J'ai mis x15 au minbufsizbytes pour rallonger la durée(je sais pas si c'est la bonne methode) mais ca change rien au probleme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    package com.test.test;
     
    import android.app.Activity;
    import android.graphics.Color;
    import android.media.AudioFormat;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.os.Bundle;
    import android.os.SystemClock;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.GestureDetector.OnGestureListener;
    import android.widget.Button;
    import android.widget.TextView;
     
    public class test extends Activity {
     
    public AudioTrack at;
    public TextView tv;
    public TextView Start;
    public TextView Stop;
     
     
    public int minbufsizbytes;
    public int bufsizbytes;
    public int bufsizsamps;
    public final int samprate = 44100;
    public short[] buffer=null;
    public final float f=1000.0f; //beep freq
    public final float MAXVOL=(float)1.0;
    public final float MINVOL=(float)0.01;
    public final int LOOPON= -1;
    public final int LOOPOFF=0;
    public int tmp;
    int ok=0;
     
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
     
    Start = (Button)findViewById(R.id.Start);
    Stop = (Button)findViewById(R.id.Stop);
     
    Start.setOnClickListener(play);
    Stop.setOnClickListener(stop_play);
     
     
     
    tv= (TextView)findViewById(R.id.tv1);
     
    minbufsizbytes = AudioTrack.getMinBufferSize(samprate,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT)*15; //870 at 8000, 4800 at 44100
    bufsizbytes=minbufsizbytes; //
    tv.setText("minbufsizebytes "+minbufsizbytes+"\n"); //gets to here
    bufsizsamps=bufsizbytes/2;
    buffer = new short[bufsizsamps];
    fillbuf();
     
     
    try{
    at = new AudioTrack(AudioManager.STREAM_MUSIC,samprate,
    AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_16BIT,bufsizbytes,AudioTrack.MODE_STREAM);
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    tv.append("create audiotracksnafu "+e+"\n"); //gets to here
    e.printStackTrace();
    }
     
    at.setStereoVolume(1.0f,1.0f);
     
    }//oncreate
     
     
    void fillbuf(){
    	double omega,t;
    	double dt=1.0/samprate; //sec per samp
     
    	t=0.0;
    	omega=(float)(2.0*Math.PI*f);
    	for(int i=0; i < bufsizsamps; i++){
    		buffer[i]=(short)(32000.0*Math.sin(omega*t));
    		t+=dt;
    	}
    }
     
    View.OnClickListener play = new View.OnClickListener()
    {
    	//@Override
    	public void onClick(View view) {
     
    		tv.append("in playit!\n"); //
    		at.play();
    		ok=1;
    		while (ok==1){
     
     
    			tmp=at.write(buffer, 0, bufsizsamps);
    			//SystemClock.sleep(1000L);
    			tv.append("tmpp="+tmp+"\n"); //
    		}
    	}
    };
     
     
    View.OnClickListener stop_play = new View.OnClickListener()
    {
    	//@Override
    	public void onClick(View view) {
    		tv.append("in stop!\n"); //
    		at.stop();
    		ok=0;
    	}
    };
     
     
    //----------lifecycle callbacks----------------
    @Override
    public void onPause(){
    super.onPause();
    at.pause();
    tv.append("onpause!\n"); //gets to here
    }
     
    @Override
    public void onResume(){
    super.onResume();
    tv.append("onresume!\n"); //gets to here
    // playit();
    }
     
    @Override
    public void onStop(){
    super.onStop();
    at.stop();
    tv.append("onstop!\n"); //gets to here
    }
     
     
     
    }//activity
    Et aussi l'activity est figé une fois le bouton cliqué.
    Applications et jeux gratuits sur http://www.kamaxandroid.com

  6. #6
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Assure-toi que le sample de la fin de ton buffer s'accorde bien avec le sample de début. Sinon tu as une discontinuité dans ta sinusoïde qui se traduit par un claquement à l'écoute.

  7. #7
    Membre habitué Avatar de linked
    Profil pro
    Développeur Android
    Inscrit en
    Mai 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Mai 2008
    Messages : 88
    Points : 133
    Points
    133
    Par défaut
    Ok merci, je vais essayer de creuser un peu cette histoire de sinusoide.
    Applications et jeux gratuits sur http://www.kamaxandroid.com

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2009, 20h48
  2. [Turbo Pascal] Générer du son sur la carte son
    Par boudakou dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 20/02/2009, 19h23
  3. [Carte Son] Générer un son défini avec python (fréquence, forme du signale etc..)
    Par moumine dans le forum Programmation multimédia/Jeux
    Réponses: 14
    Dernier message: 18/02/2009, 14h42
  4. [son] générer un son
    Par _yeye_ dans le forum SDL
    Réponses: 1
    Dernier message: 10/06/2008, 19h45
  5. [VisualC++][audio] générer un son
    Par _yeye_ dans le forum C++
    Réponses: 9
    Dernier message: 10/06/2008, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo