2010-07-15 2 views
0

Учитывая эти инструкции, я был бы очень признателен, если бы кто-то помог разобрать вопросы, написанные как комментарии.вопросы о рисовании линий формы волны (java)

Моя цель - создать аудио инструмент в Java, основной функцией которого является: - отображение формы сигнала во время воспроизведения звукового файла.

Спасибо вам much..Ulrike

// here the list lines , does it store points (line coordinates) ??? 


    List<Byte> audioBytes; 
    List<Line2D.Double> lines; 




    public void addAudioByte(byte b) { 
       audioBytes.add(b); 
      } 




public void createWaveForm() { 

     if (audioBytes.size() == 0) { 
      return; 
     } 

     AudioFormat format = audioInputStream.getFormat(); 


     Dimension d = getSize(); 
     int w = d.width; 
     int h = d.height - 15; 



      // calculate number of frames per pixel 


int frames_per_pixel = audioBytes.size()/format.getFrameSize()/w; 
     byte my_byte = 0; 
     double y_last = 0; 
     int numChannels = format.getChannels(); 
     for (double x = 0; x < w && audioData != null; x++) { 
      // here what happens??? 
      int idx = (int) (frames_per_pixel * numChannels * x); 

      if (format.getSampleSizeInBits() == 8) { 
       my_byte = (byte) audioData[idx]; 
      } else { 
        // here what happens??? 


my_byte = (byte) (128 * audioData[idx]/32768); 
      } 
       // does this code draw the line ??? 
       // Y samples values 


double y_new = (double) (h * (128 - my_byte)/256); 
      lines.add(new Line2D.Double(x, y_last, x, y_new)); 
      y_last = y_new; 
     } 


     repaint(); 
    } 
    // does this method draw the lines??? what does it do? 
     public void paint(Graphics g) { 
      // component dimensions 
      Dimension d = getSize(); 
      g.setColor(getBackground()); 
      g.fillRect(0, 0, d.width, d.height); 

      if (audioBytes.size() == 0) { 
       return; 
      } 

      // I suppose this is where the lines are actually drawn 
     // The lines (so the waveform) are points and here they get connected based on the content 
     // of the list lines (declared above) ..is my reasoning correct?   
      g.setColor(Color.LIGHT_GRAY); 
      for (int i = 1; i < lines.size(); i++) { 
       Line2D.Double line = lines.get(i); 
       g.drawLine((int) line.x1, (int) line.y1, (int) line.x2, (int) line.y2); 
      } 
     } 
    } 

ответ

0

Метод createWaveforms(), кажется, анализируя звуковой файл и создать список под названием lines линий (типа Line2D). Каждый из этих объектов линии имеет начальную и конечную точку, обозначенные x1, y1 и x2, y2.

Метод paint() имеет петлю, чтобы пройти через все эти сохраненные строки и нарисовать линию на холсте, соответствующую сохраненному сегменту линии. Предполагая, что остальная часть кода работает, эти строки будут выглядеть - ну, наверное, волна.

0

Прежде всего, спасибо за то, что вы спросили об этом, потому что мне тоже любопытно использовать цифры, и если они должны меняться в зависимости от данных, например, я в настоящее время записываю и воспроизвожу со скоростью o 128k, поэтому есть намного больше байт, чем 44100.

Любой путь, я думаю, что я могу ответить на эту часть вашего вопроса ..

// here what happens??? 

    int idx = (int) (frames_per_pixel * numChannels * x); 

Я считаю, что это определение, сколько кадров аудиоданных будут представлены в каждом пикселе форму волны и установку idx в первый байт каждого блока данных, пропускающих байты между ними.

+0

Вы уверены, что она все еще хочет знать после почти трех лет? –

Смежные вопросы