lancer simultanément 4 pistes sons
Bonjour,
Je travaille sur une BD interactive dans le cadre de mon projet tutoré de secondes années d'IUT multimédia. Je débute en Java.
Voici mon probléme. La dernière planche de ma BD doit "générer" une chanson en prenant en compte des paramétres affecté par le lecteur tout au long de l'hitoire. Pour générer cette chanson, le programme récupére 4 pistes audio (une guitare, une basse, une baterie et un piano). Je dois ensuite lancer ces 4 pistes pour ne former qu'une seule chanson. Seulement mon probléme est qu'il y a un léger décalage de quelques centiéme de seconde, et du coup ça rend vraiment pas beau.
Voici le contenu de mon code (simplifié pour les tests):
Code:
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
|
public Planche46(String nom, boolean test)
{
choixSample();
th1 = new Thread(this);
th1.start();
}
/** cette méthode récupére les données
* necessaire aux calculs pour selectionner
* les samples des musiciens
*/
public void ChoixSample()
{
//divers calculs remplissant ses variables
smpGuitare = "musiques"+File.separator+"guitare.mp3";
smpBasse = "musiques"+File.separator+"basse.mp3";
smpPiano = "musiques"+File.separator+"piano.mp3";
smpDrum = "musiques"+File.separator+"drum.mp3";
}
public void run()
{
guitare = new Chargementduson (smpGuitare);
basse = new Chargementduson (smpBasse);
piano = new Chargementduson (smpPiano);
drum = new Chargementduson (smpDrum);
} |
et le contenu de la classe Chargementduson:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
Player lecteur;
public Chargementduson(String son) // constructeur
{
File fichier = new File(son);
try
{
lecteur = Manager.createPlayer(fichier.toURL());
}
catch (MediaException me)
{ System.out.println("Probleme de chargement"); }
catch (IOException e)
{ System.out.println("Lecture du fichier son impossible"); }
lecteur.start();
} |
voilà, comment faire pour que les pistes sont soient lancées vraiment simultanément (je tiens à dire que les enregistrement sont bien calées à l'aide de logiciel de traitement du son)
Merci de votre aide.
ActionListener, audio multi-tracks
c'est simple, il faut essayer d'implémenter l'interface actionListener pour chaque piste audio. Ensuite la classe Main devra appeler les ActionListeners implémentés en synchro. Techniquement les pistes vont se lancer à qqs "ms" l'une après l'autre ou dans un second temps tu poses une condition en TIMESTAMP dans chaque interface.
Code:
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
|
class Main {
static HashSet<ActionListener e> listeners = new HashSet();
static void addActionListener(ActionListener l) {
listeners.add(l);
}
static void removeActionListener(ActionListener l) {
listeners.remove(l);
}
private class PisteSonore implements ActionListener, Runnable {
long startTime; URL file; AudioClip au;
public PisteSonore(String file, long startTime) {
this.startTime = startTime;
this.file = new URL(file);
}
private void load() {
au = Applet.newAudioClip(new URL(getClass().getResource(file)));
}
public void run() {
au.play();
}
public void actionPerformed(ActionEvent e) {
load();
while(System.currentTimeMillis() < startTime) {
// wait
}
new Thread(this).start()
}
}
public static void main(String[] args) {
long start = System.currentTimeMillis() + 5000; // 5 sec. delay
PisteSonore p0 = new PisteSonore("maPiste.aiff", start);
PisteSonore p1 = new PisteSonore("maPiste1.aiff", start);
PisteSonore p2 = new PisteSonore("maPiste2.aiff", start);
PisteSonore p3 = new PisteSonore("maPiste3.aiff", start);
addActionListener(p0); addActionListener(p1); addActionListener(p2);
addActionListener(p3);
for(Iterator i = listeners.iterator(); i.hasNext()) // compte-a-rebours
((PisteSonore)i.next()).actionPerformed(null);
}
} |
Voilà.:aie: