/* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * WavePanel.java * * Created on 30 sept. 2011, 09:09:09 */ package feuille.karaoke.audio; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Composite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.geom.Line2D; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.imageio.ImageIO; import javax.imageio.stream.FileImageOutputStream; import javax.media.Manager; import javax.media.MediaLocator; import javax.media.Player; import javax.media.Time; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; /** * * @author The Wingate 2940 */ public class WavePanel extends javax.swing.JPanel implements Runnable { File fichierSon = null; //Le fichier son qu'on se prépare à lire/timer AudioInputStream ais; //Le flux contenant le fichier Player audioPlayer; //Ce qui permet de lire le fichier Thread audioThread; //Une tâche: affichage temps écoulé et progression File fichierImage = new File("d:/waveOutput.png"); //Contient la forme d'onde générée Image image = null; Color cCourbe = Color.gray; //Couleur de la courbe Color cCourant = Color.magenta; //Couleur de la barre de progression Color cZone1 = Color.yellow; //Couleur de la barre d'encadrement inférieure Color cZone2 = Color.red; //Couleur de la barre d'encadrement supérieur int x=0; //Variable du temps t int x1=0; //Variable de limite inférieure d'encadrement int x2=0; //Variable de limite supérieure d'encadrement double T=0.0; //Temps total en secondes double t=0.0; //Temps à l'instant t double t1=0.0; //Temps de limite inférieure d'encadrement double t2=0.0; //Temps de limite supérieure d'encadrement String debut="0.00.00.00"; //Temps de limite inférieure d'encadrement String fin="0.00.00.00"; //Temps de limite supérieure d'encadrement int totalPixels = 0; //Pixels des images générés int displayZone = 0; //Pixel de la vue actuel par rapport à la scrollbar (valeur absolue de la scrollbar) Tags tags = new Tags(); Tag currenttag = new Tag(); Tag leftTag = new Tag(); Tag rightTag = new Tag(); boolean tagMove = false; int kx1 = 0; int kx2 = 0; double kt1 = 0.0; double kt2 = 0.0; private Float alpha = 0.2f; //Pour connaitre la transparence de l'image (0f = transparent ; 1f=opaque). java.util.List<String> arlFichierImage = new java.util.ArrayList<String>(); /** Creates new form WavePanel */ @SuppressWarnings("OverridableMethodCallInConstructor") public WavePanel() { initComponents(); init(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { setBackground(new java.awt.Color(204, 255, 204)); addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { formMousePressed(evt); } public void mouseReleased(java.awt.event.MouseEvent evt) { formMouseReleased(evt); } }); addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(java.awt.event.MouseEvent evt) { formMouseDragged(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); }// </editor-fold>//GEN-END:initComponents private void formMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseReleased if(evt.getButton()==2){ if(tags.isSet()){ for(Tag stag : tags.getTags()){ if(currenttag.equals(stag)){ currenttag.setX(evt.getX()); currenttag = new Tag(); repaint(); tagMove = false; } } } } }//GEN-LAST:event_formMouseReleased private void formMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMousePressed if(evt.getButton()==2){ if(tags.isSet()){ for(Tag stag : tags.getTags()){ if(stag.mouseOver(evt.getX())){ currenttag = stag; repaint(); tagMove = true; } } } } }//GEN-LAST:event_formMousePressed private void formMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseDragged if(tagMove==true){ if(tags.isSet()){ for(Tag stag : tags.getTags()){ if(currenttag.equals(stag)){ if(leftTag!=null && leftTag.equals(stag)){ leftTag.setX(evt.getX()); kx1=evt.getX(); } if(rightTag.equals(stag)){ rightTag.setX(evt.getX()); kx2=evt.getX(); } currenttag.setX(evt.getX()); repaint(); } } } } }//GEN-LAST:event_formMouseDragged // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables @SuppressWarnings("ResultOfObjectAllocationIgnored") public void init(){ arlFichierImage.clear(); totalPixels = 0; new wpMouseListener(this); } // <editor-fold defaultstate="collapsed" desc="JavaSound API + JMF API methods"> private boolean writeInImageOutput(FileImageOutputStream fileIOS, BufferedImage bi, boolean andCloseIt){ try{ //Appends new graphics to the output ImageIO.write(bi, "PNG", fileIOS); if(andCloseIt==false){ fileIOS.flush(); }else{ fileIOS.close(); } }catch (java.io.IOException ioe){ System.out.println("PNG Aborted"); return false; } return true; } /** Crée un flux audio */ public void createAudioInputStream(File f){ try{ ais = AudioSystem.getAudioInputStream(f); fichierSon = f; }catch ( javax.sound.sampled.UnsupportedAudioFileException uafe){ }catch( java.io.IOException ioe){ } if(ais!=null){ //createWaveForm(null,0,0); //wav(); new_wav2(fichierImage.getAbsolutePath()); //Crée le(s) fichier(s) image(s). prepareToPlay(); // On prépare le player et on définit le temps T } } public void new_wav2(String imagePath){ byte[] audioBytes; AudioFormat format = ais.getFormat(); //Flux dans lequel l'image est générée FileImageOutputStream f = null; //Cache de l'image; à écrire dans le flux BufferedImage bi = null; //Outil de dessin dans l'image Graphics2D g2 = null; //On cherche à déterminer combien d'images générer en fonction des //bytes et de déterminer la taille des images. //On part sur l'échelle 833.334 samples = 1.000 pixels int nbBytes = (int)ais.getFrameLength()*format.getFrameSize(); System.out.println("Nombre de bytes : "+nbBytes); int nbTableau = nbBytes/833334; System.out.println("Nombre de tableaux : "+nbTableau+" Réel : "+(nbBytes/833334)); int bytesRestants = nbBytes-833334*nbTableau; System.out.println("Nombre de bytes restants : "+bytesRestants); int tailleDerniereImage = Math.round(1000*bytesRestants/833334); System.out.println("Largeur de la dernière image : "+tailleDerniereImage); for(int tab=0;tab<=nbTableau;tab++){ //Fichier du dessin String new_imagePath = imagePath.substring(0, imagePath.lastIndexOf("."))+"-"+tab+".png"; try{ f = new FileImageOutputStream(new File(new_imagePath)); arlFichierImage.add(new_imagePath); }catch (Exception exc){ } //Remplissage de audioBytes try { if(tab==nbTableau){ audioBytes = new byte[bytesRestants]; ais.read(audioBytes); }else{ audioBytes = new byte[833334]; ais.read(audioBytes); } } catch (Exception ex) { System.out.println("Erreur monumentale"); //Cà bloque là return; } //Renseignement sur la zone graphique à peindre int h = getSize().height; //Renseignement pour la génération byte my_byte = 0; double y_last = 0; //Mise en place d'un compteur //int compteur2 = 0;// Compteur de boucles de samples //Exploitation de audioBytes - mise en forme des lignes graphiques int maValeur = 0; //Le nombre de samples à traiter int nlengthInSamples = 0; //Le nombre de samples sur une zone de 30000 int nbSamplesInArea = 200000; //Le nombre de pixels total de l'image int nbPixelsInImage = 1000; if(tab==nbTableau){ nbPixelsInImage = tailleDerniereImage; totalPixels += tailleDerniereImage; }else{ totalPixels += 1000; } if(format.getSampleSizeInBits() == 16){ //On se renseigne sur la nombre de samples nlengthInSamples = audioBytes.length / 2; //On veut 1000; nbSamplesInArea = nlengthInSamples; //Crée une nouvelle image //System.out.println("16|Taille horizontal de l'image: "+nbPixelsInImage); //System.out.println("16|Nombre de samples: "+nlengthInSamples); //System.out.println("16|Nombre de samples par zone dans le buffer: "+nbSamplesInArea); bi = new BufferedImage(nbPixelsInImage,getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); //Crée un outil pour dessiner //System.out.println("16|1°point OK"); g2 = bi.createGraphics(); //System.out.println("16|2°point OK"); //Change la couleur du dessin g2.setColor(this.cCourbe); //System.out.println("16|3°point OK"); if (format.isBigEndian()) { for (int i = 0; i < nlengthInSamples; i++) { /* First byte is MSB (high order) */ int MSB = (int) audioBytes[2*i]; /* Second byte is LSB (low order) */ int LSB = (int) audioBytes[2*i+1]; maValeur = MSB << 8 | (255 & LSB); my_byte = (byte) (128 * maValeur / 32768 ); double gx = i/(nbSamplesInArea/1000); //double gx = (i - compteur2*nbSamplesInArea)/(nbSamplesInArea/30000); //(double) (w*i)/nlengthInSamples; double y_new = (double) (h * (128 - my_byte) / 256); g2.draw(new Line2D.Double(gx, y_last, gx, y_new)); bi.flush(); y_last = y_new; } }else{ for (int i = 0; i < nlengthInSamples; i++) { /* First byte is LSB (low order) */ int LSB = (int) audioBytes[2*i]; /* Second byte is MSB (high order) */ int MSB = (int) audioBytes[2*i+1]; maValeur = MSB << 8 | (255 & LSB); my_byte = (byte) (128 * maValeur / 32768 ); double gx = i/(nbSamplesInArea/1000); //double gx = (i - compteur2*nbSamplesInArea)/(nbSamplesInArea/30000); //(double) (w*i)/nlengthInSamples; double y_new = (double) (h * (128 - my_byte) / 256); g2.draw(new Line2D.Double(gx, y_last, gx, y_new)); bi.flush(); y_last = y_new; } } }else if(format.getSampleSizeInBits() == 8){ nlengthInSamples = audioBytes.length; nbSamplesInArea = nlengthInSamples; //System.out.println("08|Taille horizontal de l'image: "+nbPixelsInImage); //System.out.println("08|Nombre de samples: "+nlengthInSamples); //System.out.println("08|Nombre de samples par zone dans le buffer: "+nbSamplesInArea); bi = new BufferedImage(nbPixelsInImage,getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); //System.out.println("08|1°point OK"); g2 = bi.createGraphics(); //System.out.println("08|2°point OK"); g2.setColor(this.cCourbe); //System.out.println("08|3°point OK"); if (format.getEncoding().toString().startsWith("PCM_SIGN")) { for (int i = 0; i < audioBytes.length; i++) { maValeur = audioBytes[i]; my_byte = (byte)maValeur; double gx = i/(nbSamplesInArea/1000); //double gx = i/(nbSamplesInArea/30000); //(double) (w*i)/nlengthInSamples; double y_new = (double) (h * (128 - my_byte) / 256); g2.draw(new Line2D.Double(gx, y_last, gx, y_new)); bi.flush(); y_last = y_new; } }else{ for (int i = 0; i < audioBytes.length; i++) { maValeur = audioBytes[i] - 128; my_byte = (byte)maValeur; double gx = i/(nbSamplesInArea/1000); //double gx = i/(nbSamplesInArea/30000); //(double) (w*i)/nlengthInSamples; double y_new = (double) (h * (128 - my_byte) / 256); g2.draw(new Line2D.Double(gx, y_last, gx, y_new)); bi.flush(); y_last = y_new; } } } //Sauvegarde le fichier image contenant la forme d'onde this.writeInImageOutput(f,bi,true);//Sauvegarde le flux restant //try{ImageIO.write(bi, "PNG", fichierImage); //}catch(IOException ioe){System.out.println("PNG Aborted");} image = Toolkit.getDefaultToolkit().getImage(fichierImage.getPath()); // setSize(nbPixelsInImage,getHeight()); // sb2.setMaximum(nbPixelsInImage-90); System.out.println(tab+"/"+nbTableau+" file(s) :: PNG -OK"); } repaint(); } // </editor-fold> // <editor-fold defaultstate="collapsed" desc="Funsub (TimingGood)"> // Cet espace contient les méthodes de Funsub ou plutôt du composant // TimingGood. Revues et corrigées pour WaveSound. /** Repaint le composant de temps en faisant avancer la barre de temps t */ private void progressMe(){ if(audioPlayer!=null){ int oldx = x; x = timeToPixel(audioPlayer.getMediaTime().getSeconds(),true); if(oldx!=x){ repaint(); } } } /** Retourne le pixel sur x approximatif du temps recherché */ private int timeToPixel(double time, boolean isNano){ int tpx = 0; //pixel = nano*pixel/nano if(isNano==true){ tpx=(int)(time*getWidth()/T); }else{ tpx=(int)time*getWidth()/(int)T; } return tpx; } public void createNewSound(String path){ try{ audioPlayer = Manager.createRealizedPlayer(new MediaLocator("file:///"+path)); }catch (javax.media.CannotRealizeException cre){ System.out.println("non réalisable"); }catch (javax.media.NoPlayerException npe){ //Nothing }catch (java.io.IOException ioe){ //Nothing } //On se renseigne sur le temps du média T=audioPlayer.getDuration().getSeconds(); } public void prepareToPlay(){ createNewSound(fichierSon.getAbsolutePath()); } /** Ferme un son */ public void deleteASound(){ if(audioPlayer!=null){ System.out.println("Bip, on passe"); audioPlayer.deallocate(); //audioPlayer.close(); } } /** Joue un son en entier */ public void playAllSound(){ stopSound();//Arrêt préventif if (audioPlayer!=null){ startTH(); audioPlayer.setMediaTime(new Time(0.0)); audioPlayer.start(); } } /** Joue un son à partir de t */ public void playSound(){ stopSound();//Arrêt préventif if (audioPlayer!=null){ startTH(); audioPlayer.setMediaTime(new Time(t)); audioPlayer.start(); } } /** Joue un son de t1 à t2 */ public void playSoundFrom(){ stopSound();//Arrêt préventif if (audioPlayer!=null){ if(tags.isSet()){ audioPlayer.setMediaTime(new Time(pixelToTime(kx1))); audioPlayer.setStopTime(new Time(pixelToTime(kx2))); }else{ audioPlayer.setMediaTime(new Time(t1)); audioPlayer.setStopTime(new Time(t2)); } startTH(); audioPlayer.start(); } } /** Joue un son de t1-0.5 à t1 */ public void playSoundBeforeBegin(){ stopSound();//Arrêt préventif if (audioPlayer!=null){ if(tags.isSet()){ audioPlayer.setMediaTime(new Time(pixelToTime(kx1)-0.5)); audioPlayer.setStopTime(new Time(pixelToTime(kx1))); }else{ audioPlayer.setMediaTime(new Time(t1-0.5)); audioPlayer.setStopTime(new Time(t1)); } startTH(); audioPlayer.start(); } } /** Joue un son de t1 à t1+0.5 */ public void playSoundAfterBegin(){ stopSound();//Arrêt préventif if (audioPlayer!=null){ if(tags.isSet()){ audioPlayer.setMediaTime(new Time(pixelToTime(kx1))); audioPlayer.setStopTime(new Time(pixelToTime(kx1)+0.5)); }else{ audioPlayer.setMediaTime(new Time(t1)); audioPlayer.setStopTime(new Time(t1+0.5)); } startTH(); audioPlayer.start(); } } /** Joue un son de t2-0.5 à t2 */ public void playSoundBeforeEnd(){ stopSound();//Arrêt préventif if (audioPlayer!=null){ if(tags.isSet()){ audioPlayer.setMediaTime(new Time(pixelToTime(kx2)-0.5)); audioPlayer.setStopTime(new Time(pixelToTime(kx2))); }else{ audioPlayer.setMediaTime(new Time(t2-0.5)); audioPlayer.setStopTime(new Time(t2)); } startTH(); audioPlayer.start(); } } /** Joue un son de t2 à t2+0.5 */ public void playSoundAfterEnd(){ stopSound();//Arrêt préventif if (audioPlayer!=null){ if(tags.isSet()){ audioPlayer.setMediaTime(new Time(pixelToTime(kx2))); audioPlayer.setStopTime(new Time(pixelToTime(kx2)+0.5)); }else{ audioPlayer.setMediaTime(new Time(t2)); audioPlayer.setStopTime(new Time(t2+0.5)); } startTH(); audioPlayer.start(); } } /** Arrête un son */ public void stopSound(){ if (audioPlayer!=null){ stopTH(); audioPlayer.stop(); } } /** Retourne t1 sous la forme 0.00.00.00 */ public String getStart(){ return debut; } /** Retourne t2 sous la forme 0.00.00.00 */ public String getEnd(){ return fin; } /** La couleur de la forme d'onde */ public void setGraphColor(Color c){ cCourbe = c; } /** La couleur de la barre de progession sur la forme d'onde */ public void setProgressColor(Color c){ cCourant = c; } /** La couleur de la barre de début de zone sur la forme d'onde */ public void setT1Color(Color c){ cZone1 = c; } /** La couleur de la barre de fin de zone sur la forme d'onde */ public void setT2Color(Color c){ cZone2 = c; } /** Démarre la/les tâche/s */ private void startTH() { audioThread = new Thread(this); audioThread.start(); } /** Arrête la/les tâche/s */ private void stopTH() { if (audioThread != null) { audioThread.interrupt(); } audioThread = null; } /** Retourne le temps t sous la forme 0.00.00.00 du temps recherché */ private String timeToTiming(double time){ String timing = ""; time=time*100; //Support des centièmes de secondes int hour = (int)time/360000; int min = ((int)time - 360000*hour)/6000; int sec = ((int)time - 360000*hour - 6000*min)/100; int cSec = (int)time - 360000*hour - 6000*min - 100*sec; String Smin, Ssec, Scent; if (min<10){Smin = "0"+min;}else{Smin = String.valueOf(min);} if (sec<10){Ssec = "0"+sec;}else{Ssec = String.valueOf(sec);} if (cSec<10){Scent = "0"+cSec;}else{Scent = String.valueOf(cSec);} timing = hour + "." + Smin + "." + Ssec + "." + Scent; return timing; } /** Retourne le temps t en secondes du pixel recherché */ private double pixelToTime(int px){ double ptx = 0.0; //nano = pixel*nano/pixel ptx = px*T/getWidth(); return ptx; } /** Retourne le temps t sous la forme 0.00.00.00 du pixel recherché */ private String pixelToTiming(int px){ String timing = ""; double ptx = 0.0; ptx = px*T/getWidth(); //secondes ptx=ptx*100; //Support des centièmes de secondes int hour = (int)ptx/360000; int min = ((int)ptx - 360000*hour)/6000; int sec = ((int)ptx - 360000*hour - 6000*min)/100; int cSec = (int)ptx - 360000*hour - 6000*min - 100*sec; String Smin, Ssec, Scent; if (min<10){Smin = "0"+min;}else{Smin = String.valueOf(min);} if (sec<10){Ssec = "0"+sec;}else{Ssec = String.valueOf(sec);} if (cSec<10){Scent = "0"+cSec;}else{Scent = String.valueOf(cSec);} timing = hour + "." + Smin + "." + Ssec + "." + Scent; return timing; } // </editor-fold> public void setImageFilePath(String image){ fichierImage = new File(image); } public int getTotalPixels(){ return totalPixels; } public void setDisplayZone(int displayZone){ this.displayZone = displayZone; } @Override public void paint(Graphics g){ //Efface le tout Graphics2D g2 = (Graphics2D) g; g2.setBackground(Color.white); g2.clearRect(0, 0, getWidth(), getHeight()); //Dessine une forme d'onde if(arlFichierImage.isEmpty()==false){ int count = 0; for(String s : arlFichierImage){ //if(count-30000<displayZone && count+30000>displayZone){ // javax.swing.ImageIcon img2 = new javax.swing.ImageIcon(s); // g2.drawImage(img2.getImage(),0+count,0,null); //} //count += 30000; //if(count-1000<displayZone && count+1000>displayZone){ // javax.swing.ImageIcon img2 = new javax.swing.ImageIcon(s); // g2.drawImage(img2.getImage(),0+count,0,null); //} //count += 1000; javax.swing.ImageIcon img2 = new javax.swing.ImageIcon(s); g2.drawImage(img2.getImage(),0+count,0,null); count += 1000; } } //Définit une couleur blanche g.setColor(cCourant); //Dessine la barre de progression g.drawLine(x,0,x,this.getHeight()); //Définit une couleur jaune g.setColor(cZone1); //Dessine le limiteur d'encadrement inférieure g.drawLine(x1,0,x1,this.getHeight()); //Définit une couleur rouge g.setColor(cZone2); //Dessine le limiteur d'encadrement supérieure g.drawLine(x2,0,x2,this.getHeight()); try{ if(leftTag.isSet()==true && rightTag.isSet()==true){ g.setColor(Color.orange); Composite originalComposite = g2.getComposite(); g2.setComposite(makeComposite(alpha)); g2.fillRect(leftTag.getX(), 0, rightTag.getX()-leftTag.getX(), this.getHeight()); g2.setComposite(originalComposite); } }catch(NullPointerException npe){ //NullPOinterException = no tag available at the laft or the right int xa = 0; int xb = 0; if(leftTag==null){ xa = kx1; }else{ xa = leftTag.getX(); } if(rightTag==null){ xb = kx2; }else{ xb = rightTag.getX(); } g.setColor(Color.orange); Composite originalComposite = g2.getComposite(); g2.setComposite(makeComposite(alpha)); g2.fillRect(xa, 0, xb-xa, this.getHeight()); g2.setComposite(originalComposite); }catch(Exception exc){ //Nothing to do; We are dead if we reach this area. } if(tags.isSet()==true){ for(int i=0;i<tags.getTags().size();i++){ Tag tag = tags.getTags().get(i); if(currenttag.equals(tag)){ g.setColor(Color.blue); }else{ g.setColor(Color.orange); } g.drawLine(tag.getX(),0,tag.getX(),this.getHeight()); g.setColor(Color.green); g.drawString(tag.getSyllable(), tag.getX()-25, 10); g.setColor(cZone1); g.drawLine(tags.getStart(),0,tags.getStart(),this.getHeight()); g.setColor(cZone2); g.drawLine(tags.getEnd(),0,tags.getEnd(),this.getHeight()); } } } public void modifyTags(String sentence, int x1, int x2){ tags = new Tags(sentence, x1, x2); this.x1 = x1; debut = pixelToTiming(x1); t1 = pixelToTime(x1); this.x2 = x2; fin = pixelToTiming(x2); t2 = pixelToTime(x2); repaint(); } public void modifyTags(String sentence){ modifyTags(sentence, x1, x2); } // Gestion de la transparence private AlphaComposite makeComposite(float alpha) { int type = AlphaComposite.SRC_OVER; return(AlphaComposite.getInstance(type, alpha)); } public String getKaraoke(){ String sentence = ""; if(tags.isSet()==true){ double sDebut = pixelToTime(tags.getStart()); double sCumul = 0d; for(int i=0;i<tags.getTags().size();i++){ Tag tag = tags.getTags().get(i); double second = pixelToTime(tag.getX()); //System.out.println("Seconds = "+second); double phase = second - sCumul - sDebut; double cSec = phase*100; sentence = sentence + "{\\k"+(int)cSec+"}"+tag.getSyllable(); sCumul = second - sDebut; } //System.out.println("Karaoke = "+sentence); } return sentence; } public void modifyKaraokeTags(String sentence){ Pattern p = Pattern.compile("(\\d+)\\}([^\\{]*)"); Matcher m = p.matcher(sentence); List<String> syl = new ArrayList<String>(); List<Integer> time = new ArrayList<Integer>(); while(m.find()){ time.add(Integer.parseInt(m.group(1))); syl.add(m.group(2)); } String new_sentence = ""; List<Integer> pixel = new ArrayList<Integer>(); int icumul = 0; for(int i : time){ double d = i/100d; int pt = timeToPixel(d, true); pixel.add(x1 + icumul + pt); System.out.println(x1 + icumul + pt); icumul += pt; } List<Tag> tag = new ArrayList<Tag>(); for (int i=0;i<syl.size();i++){ Tag t4g = new Tag(syl.get(i), pixel.get(i)); tag.add(t4g); new_sentence += syl.get(i); } tags = new Tags(tag, new_sentence, x1, x2); debut = pixelToTiming(x1); t1 = pixelToTime(x1); fin = pixelToTiming(x2); t2 = pixelToTime(x2); repaint(); } public void resetTags(){ tags = new Tags(); currenttag = new Tag(); leftTag = new Tag(); rightTag = new Tag(); repaint(); } public int DoubleToInteger(double d){ long result = Math.round(d); String s = Long.toString(result); int i = Integer.parseInt(s); return i; } @Override @SuppressWarnings("static-access") public void run() { while (audioThread != null) { if (audioPlayer!=null && audioPlayer.getState()!=audioPlayer.Realizing){ progressMe(); } } } public class wpMouseListener extends java.awt.event.MouseAdapter { protected WavePanel wp; /** Creates a new instance of controlPanelMouseListener */ @SuppressWarnings("LeakingThisInConstructor") public wpMouseListener(WavePanel wp) { super(); this.wp = wp; wp.addMouseListener(this); } /** Retourne le composant controlPanel en cours */ public WavePanel getWavePanel(){ return wp; } @Override public void mouseClicked(java.awt.event.MouseEvent e){ if (javax.swing.SwingUtilities.isLeftMouseButton(e)){ leftClickAction(e); }else if(javax.swing.SwingUtilities.isMiddleMouseButton(e)){ middleClickAction(e); }else{ rightClickAction(e); } } protected void rightClickAction(java.awt.event.MouseEvent e){ x2=e.getX(); wp.repaint(); fin = pixelToTiming(x2); t2 = pixelToTime(x2); // System.out.println("Valeurs -> x2 = "+x2+" t2 = "+t2+"\nFin = "+fin); } protected void middleClickAction(java.awt.event.MouseEvent e){ x=e.getX(); wp.repaint(); } protected void leftClickAction(java.awt.event.MouseEvent e){ if(tags.isSet()){ Tag tag = tags.getLeftTag(e.getX()); leftTag = tag; if(tag!=null){ kx1 = tag.getX(); }else{ kx1 = x1; } tag = tags.getRightTag(e.getX()); rightTag = tag; if(tag!=null){ kx2 = tag.getX(); }else{ kx2 = tags.getLastTag().getX(); } wp.repaint(); System.out.println("lefttag - "+kx1+" / righttag - "+kx2); }else{ x1=e.getX(); wp.repaint(); debut = pixelToTiming(x1); t1 = pixelToTime(x1); // System.out.println("Valeurs -> x1 = "+x1+" t1 = "+t1+"\nDébut = "+debut); } } } }