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

Développement Web en Java Discussion :

Java EE - Java Sound ; DSP ; spectrogramme


Sujet :

Développement Web en Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Java EE - Java Sound ; DSP ; spectrogramme
    Salut a tous
    //off topic
    je suis nouveau sur le forum, je suis dev Java EE avec deux ans d'exp.

    Problématique
    Ce sujet est au départ une envie, purement personnelle, du au fait que j'aime la musique et l'informatique.
    Pour faire simple je veux faire appli reconnaissant les fréquences d'un son de musique (un peu comme le média player windows, ou bien sonic visualizer sur Linux, ou bien audacity) et ainsi de détecter les pics de fréquences, le passage d'une écoute d'instrument à une écoute de voix etc etc etc

    La base :
    je me suis construit une stack technologique avec Java 8 + glassfish 4 + EJB 3 qui fonctionne , avec toute la conf : c'est fait
    j'ai trouvé la meilleure lib java pour du DSP (digital signal processing) : fait : https://github.com/JorenSix/TarsosDSP ; https://0110.be/Software

    "TarsosDSP" est meilleure que la lib "Minim" car plus complète et beaucoup mieux documentée, en plus d'être très récente.

    D'ailleurs dans TarsosDSP , plusieurs algos de PITCH sont implémentés, dont il ne resterait qu'a paramétré l'affichage , tout le "compute" est déjà fait !

    maintenant j'attaque le coeur du sujet :
    - tester la librairie avec des exemples simples
    - obtenir un rendu visuel sur le navigateur web, obtenu via la librairie (spectrogramme)

    Ce poste a une double utilité :
    - montrer mon avancement
    - mettre en évidence les questions et blocage que je rencontre

    Pour l'instant je manque un peu de motivation, ça peut être super hard comme ça peut être simple

    - Le point le plus bloquant a venir va être : comment est ce que je peux afficher le graphe de fréquences ? il est calculé dans la librairie et affiché dans les exemples avec du Swing mais moi je vais faire tourner du .XHTML avec mon JSF 2 :o
    En effet il y a des composants JPanel et autres (typique de Swing) dans les classes d'exemple de la lib --> je vais devoir faire un équivalent en HTML


    edit : il existe ce genre trucs je sais pas ce que ca vaut http://agileengine.com/products/ajaxswing/demos.html

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    j'ai reussi a inclure le jar de TarsosDSP dans mon appli en suivant ce qui est décrit ic i : http://www.mkyong.com/maven/how-to-i...al-repository/

    J'arrive aussi a faire executer les classes d'exemples de TarsosDSP dans mon projet java EE en faisant un clic droit sur Netbeans > Run et ça m'ouvre la fenêtre de l'applciation en SWING

    -> a tester chez moi car pour l'instant ca me fait des execeptions du style :
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Line unsupported: interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, big-endian
    at com.sun.media.sound.PortMixer.getLine(PortMixer.java:137)
    at pandora.commun.app.sound.examples.PitchDetectorExample.setNewMixer(PitchDetectorExample.java:140)
    at pandora.commun.app.sound.examples.PitchDetectorExample.access$200(PitchDetectorExample.java:56)
    at pandora.commun.app.sound.examples.PitchDetectorExample$2.propertyChange(PitchDetectorExample.java:96)
    at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:328)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
    at java.awt.Component.firePropertyChange(Component.java:8422)
    at pandora.commun.app.sound.examples.InputPanel.access$000(InputPanel.java:41)
    at pandora.commun.app.sound.examples.InputPanel$1.actionPerformed(InputPanel.java:74)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    C'est comme ci j'avais pas une entrée micro sur la carte son (normal c'est un pc du boulot) - a vérifier

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    j'ai pu tester chez moi avec une vraie carte son et un entrée microphone , la lib fonctionne bien

    -> je commence a pratiquer avec cette lib
    j'ai pu aussi ouvrir un ticket car elle a été compilé en Java 7 par erreur j'ai lancé une compil en Java 6 https://github.com/JorenSix/TarsosDSP/issues/89

    Prochaine étape refaire mon test :
    javac -classpath TarsosDSP-2.3.jar pandora/commun/app/sound/examples/*.java

    jar -cvfm Spectrogram.jar manifest.txt pandora/commun/app/sound/examples/*.class

    java -jar Spectrogram.jar NIMaschineComposingaBeatPart2AddingDrums.wav

    De manière a customiser l'implémentation du Spectrogram et a voir le résultat

    OK ca fonctionne, avec un JDK 8

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut et voila
    c'est chose faite (il faut oublier l'api TarsosDSP qui fonctionne mal, j'ai pris Minim a la place, elle fonctionne mieux est elle est plus complète)

    en gros la version de départ buguée était ici : http://gracefulspoon.com/blog/2009 [...] ment-64576

    et voici ma version bien améliorée :

    Hello every body i used this sample to improve it significally. I have far better performance, better code in terms of best practices and severals bugs are fixed.

    you can find my version here (4 classes) :

    Code :
    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
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    package minimsoundapp;
    import ddf.minim.analysis.*;
    import ddf.minim.*;
    import java.awt.Color;
    import processing.core.*;
    import processing.core.PApplet;
    import static processing.core.PApplet.map;
    import static processing.core.PConstants.TRIANGLE_STRIP;
    public class ThreeDimensionSpectrum extends PApplet {
    FFT fftLog;
    Minim minim;
    AudioPlayer audioplayer;
    final int TOTAL_TRACE_LENGTH=300;
    final int X_AXIS_SCALE=40;
    final int Y_AXIS_SCALE=8;
    final int Z_AXIS_SCALE=7;
    float x,y,z;
    PVector[] tempMatrix;
    PVector[] fullMatrix;
    @Override
    public void settings() {
    //size(1280, 720, P3D);
    size(480, 360, P3D);
    //size(500, 300, P3D);
    }
    @Override
    public void setup(){
    noStroke();
    minim = new Minim(this);
    audioplayer = minim.loadFile(RunSpectrum.activeFile, 1024);
    audioplayer.play();
    background(255);
    fftLog = new FFT(audioplayer.bufferSize(),audioplayer.sampleRate());
    fftLog.logAverages(22,6); //adjust numbers to adjust spacing
    tempMatrix = new PVector[fftLog.avgSize()];
    fullMatrix = new PVector[TOTAL_TRACE_LENGTH*fftLog.avgSize()];
    //longueur * largeur
    //TOTAL_TRACE_LENGTH : longueur
    //fftLog.avgSize() : largeur
    for(int i=0;i<fullMatrix.length;i++){
    fullMatrix[i]=new PVector(0, 0, 0);
    }
    }
    public void beforeDraw(){
    background(0);
    directionalLight(500,500,500,-100,-100,50);
    //directionalLight(150,150,1,sin(radians(frameCount)),cos(radians(frameCount)),1);
    ambientLight(80,80,80);
    camera((x+1000),(y+0)-(TOTAL_TRACE_LENGTH*4),-1000-200,0,y-(TOTAL_TRACE_LENGTH*4),0,0,0,1);
    //play the song
    fftLog.forward(audioplayer.mix);
    fillTempMatrix();
    updateFullMatrix();
    }
    @Override
    public void draw(){
    beforeDraw();
    int fftLogSpectrumTotalLength = fftLog.avgSize();
    float saturation = 1.0f; //saturation
    float brightness = 1f; //brightness
    for(int i=0; i<(fullMatrix.length-1); i++){
    //stroke(255,0,0);
    //locator(trace[i].x, trace[i].y, trace[i].z, 1);
    // float value = (trace[i].z*100);
    float color_input = (fullMatrix[i].x);
    float color_rescale = map(color_input, 0,fftLogSpectrumTotalLength*X_AXIS_SCALE, 0, 1);
    Color myRGBColor = Color.getHSBColor(color_rescale, saturation, brightness);
    //fill(myRGBColor.getRed(),myRGBColor.getGreen(), myRGBColor.getBlue());
    //point(trace[i].x, trace[i].y, trace[i].z);
    if( (i+1)%fftLogSpectrumTotalLength != 0 ){
    line(fullMatrix[i].x, fullMatrix[i].y, fullMatrix[i].z, fullMatrix[i+1].x, fullMatrix[i+1].y, fullMatrix[i+1].z);
    }
    stroke(myRGBColor.getRed(),myRGBColor.getGreen(), myRGBColor.getBlue());
    }
    }
    @Override
    public void stop() {
    // always close Minim audio classes when you finish with them
    audioplayer.close();
    // always stop Minim before exiting
    minim.stop();
    super.stop();
    }
    void fillTempMatrix(){
    for(int i = 0; i plus grosses valeurs de z qu’actuellement
    //calmer Z en fonction de i : gros i -> plus petites valeurs de z qu’actuellement
    //pour l’ensemble du spectre rempli la valeur
    //always get the next to last
    tempMatrix[i]= new PVector(x, y, z);
    }
    }
    void updateFullMatrix(){
    //la matrice totale fait n*fftLog.avgSize() en taille
    //car elle contient l’ensemble des frequences de 0 à fftLog.avgSize() pour chaque mesure dessinée a l’écran
    //créer un tableau total (nommé FULL) de taille 100*fftLog.avgSize();
    //une fois que le tableau TEMP est rempli avec les nouvelles mesures :
    //décaler toutes les valeurs du tableau FULL de telle manière que FULL [0] = FULL[fftLog.avgSize()] et FULL[i]=FULL[i+fftLog.avgSize()]
    for(int index=0;index<(TOTAL_TRACE_LENGTH-1)*fftLog.avgSize();index++){
    fullMatrix[index]=fullMatrix[index+fftLog.avgSize()];
    }
    //remplir le tableau FULL avec TEMP : FULL[99*fftLog.avgSize()]=TEMP[0] ; FULL[
    for(int i = 0; i<fftLog.avgSize();i++){
    //System.out.println("99*fftLog.avgSize()+i = "+99*fftLog.avgSize()+i+" ; i="+i);
    fullMatrix[(TOTAL_TRACE_LENGTH-1)*fftLog.avgSize()+i]=tempMatrix[i];
    }
    }
    }
    package minimsoundapp;
    /**
    *
    * @author formation
    */
    public class RunSpectrum {
    public static final String mp3file1="C:\\Users\\Chris\\Documents\\JavaPerso\\SoundSpectrumProjectMinimAndJavaFX\\resources\\DeorroFtElvisCrespoBailar.mp3";
    public static final String mp3file2="C:\\Users\\Chris\\Documents\\JavaPerso\\SoundSpectrumProjectMinimAndJavaFX\\resources\\BeFaithfulByFatmanScoop.mp3";
    public static final String mp3file3="C:\\Users\\Chris\\Documents\\JavaPerso\\SoundSpectrumProjectMinimAndJavaFX\\resources\\KSHMRWildcard.mp3";
    public static final String mp3file4="C:\\Users\\Chris\\Documents\\JavaPerso\\SoundSpectrumProjectMinimAndJavaFX\\resources\\NeverComeDownPRESIDENTIALREMASTER.mp3";
    public static final String activeFile=mp3file4;
    public static void main(String args[]){
    ThreeDimensionSpectrum tds = new ThreeDimensionSpectrum();
    tds.main(new String[] { "minimsoundapp.ThreeDimensionSpectrum" });
    ThreeDimensionSpectrumCloudPoints tds2 = new ThreeDimensionSpectrumCloudPoints();
    tds2.main(new String[] { "minimsoundapp.ThreeDimensionSpectrumCloudPoints" });
    //todo faire une classe mère dont deux autres héritent, de manière a avoir un Override de draw() dans chacune et un nom de classe différent pour chaque
    //de cette manière je pourrai en lancer plusieurs a la fois
    ThreeDimensionSpectrumTriangles tds3 = new ThreeDimensionSpectrumTriangles();
    tds3.main(new String[] { "minimsoundapp.ThreeDimensionSpectrumTriangles" });
    }
    }
    package minimsoundapp;
    import java.awt.Color;
    import static processing.core.PApplet.map;
    /**
    *
    * @author Chris
    */
    public class ThreeDimensionSpectrumCloudPoints extends ThreeDimensionSpectrum {
    @Override
    public void draw(){
    super.beforeDraw();
    int fftLogSpectrumTotalLength = fftLog.avgSize();
    float saturation = 1.0f; //saturation
    float brightness = 1f; //brightness
    for(int i=0; i<fullMatrix.length; i++){
    float color_input = (fullMatrix[i].x);
    float color_rescale = map(color_input, 0,fftLogSpectrumTotalLength*X_AXIS_SCALE, 0, 1);
    Color myRGBColor = Color.getHSBColor(color_rescale, saturation, brightness);
    point(fullMatrix[i].x, fullMatrix[i].y, fullMatrix[i].z);
    stroke(myRGBColor.getRed(),myRGBColor.getGreen(), myRGBColor.getBlue());
    }
    }
    }
    package minimsoundapp;
    import java.awt.Color;
    import static processing.core.PApplet.map;
    import static processing.core.PConstants.CLOSE;
    import static processing.core.PConstants.TRIANGLE_STRIP;
    /**
    *
    * @author Chris
    */
    public class ThreeDimensionSpectrumTriangles extends ThreeDimensionSpectrum{
    @Override
    public void draw(){
    super.beforeDraw();
    int fftLogSpectrumTotalLength = fftLog.avgSize();
    float saturation = 1.0f; //saturation
    float brightness = 1f; //brightness
    for(int i=1; i<fullMatrix.length-fftLogSpectrumTotalLength; i++){
    float color_input = (fullMatrix[i].x);
    float color_rescale = map(color_input, 0,fftLogSpectrumTotalLength*X_AXIS_SCALE, 0, 1);
    Color myRGBColor = Color.getHSBColor(color_rescale, saturation, brightness);
    if((i+1)%fftLogSpectrumTotalLength != 0){
    beginShape(TRIANGLE_STRIP);
    fill(myRGBColor.getRed(),myRGBColor.getGreen(), myRGBColor.getBlue());
    vertex(fullMatrix[i+1].x, fullMatrix[i+1].y, fullMatrix[i+1].z);
    vertex(fullMatrix[i].x, fullMatrix[i].y, fullMatrix[i].z);
    vertex(fullMatrix[i+1+fftLogSpectrumTotalLength].x, fullMatrix[i+1+fftLogSpectrumTotalLength].y, fullMatrix[i+1+fftLogSpectrumTotalLength].z);
    vertex(fullMatrix[i+fftLogSpectrumTotalLength].x, fullMatrix[i+fftLogSpectrumTotalLength].y, fullMatrix[i+fftLogSpectrumTotalLength].z);
    endShape(CLOSE);
    }
    }
    }
    }

    All you need is to create a Java project (in netbeans 8.1 it is nice) and import libraries of 'processing' and 'minim', you will have many jars in your project, these are required.

    11/07/2016 11:48 998 602 core.jar
    11/07/2016 11:48 4 149 gluegen-rt-natives-linux-amd64.jar
    11/07/2016 11:48 3 050 gluegen-rt-natives-linux-armv6hf.jar
    11/07/2016 11:48 4 130 gluegen-rt-natives-linux-i586.jar
    11/07/2016 11:48 5 076 gluegen-rt-natives-macosx-universal.jar
    11/07/2016 11:48 8 159 gluegen-rt-natives-windows-amd64.jar
    11/07/2016 11:48 7 577 gluegen-rt-natives-windows-i586.jar
    11/07/2016 11:48 345 605 gluegen-rt.jar
    11/07/2016 11:44 105 446 jl1.0.jar
    11/07/2016 11:48 224 010 jogl-all-natives-linux-amd64.jar
    11/07/2016 11:48 164 852 jogl-all-natives-linux-armv6hf.jar
    11/07/2016 11:48 217 274 jogl-all-natives-linux-i586.jar
    11/07/2016 11:48 443 876 jogl-all-natives-macosx-universal.jar
    11/07/2016 11:48 240 721 jogl-all-natives-windows-amd64.jar
    11/07/2016 11:48 209 445 jogl-all-natives-windows-i586.jar
    11/07/2016 11:48 3 402 029 jogl-all.jar
    11/07/2016 11:44 46 786 jsminim.jar
    11/07/2016 11:44 100 497 minim.jar
    11/07/2016 11:44 24 538 mp3spi1.9.4.jar
    11/07/2016 11:44 10 401 tritonus_aos.jar
    11/07/2016 11:44 102 673 tritonus_share.jar

    et le rendu en vidéo :


    reste plus qu'a faire tourner tout ça dans un web browser sur ma stack java 8 avec java fx et la c'est chaud

Discussions similaires

  1. [Java One] Java Rock Star : Gfx
    Par bouye dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 20/05/2006, 09h02
  2. [java library] Java object to XML
    Par Vessaz dans le forum Persistance des données
    Réponses: 2
    Dernier message: 10/04/2006, 17h52
  3. [JAVA] Appels Java possibles en C ???
    Par Gaaaga dans le forum C
    Réponses: 4
    Dernier message: 23/02/2006, 11h29
  4. Compiler du code Java via Java
    Par sozie9372 dans le forum Langage
    Réponses: 2
    Dernier message: 12/01/2006, 10h14
  5. [Conversion]Applet Java Vers Java Web Start
    Par robin206 dans le forum JWS
    Réponses: 2
    Dernier message: 20/04/2005, 09h28

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