package org.jzy3d.demos.chart2d;

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;

import net.miginfocom.swing.MigLayout;

import org.jzy3d.chart.Chart;
import org.jzy3d.chart2d.Chart2d;
import org.jzy3d.colors.Color;
import org.jzy3d.plot2d.primitives.Serie2d;
import org.jzy3d.plot3d.primitives.ConcurrentLineStrip;
import org.jzy3d.plot3d.primitives.axes.layout.IAxeLayout;
import org.jzy3d.plot3d.primitives.axes.layout.providers.PitchTickProvider;
import org.jzy3d.plot3d.primitives.axes.layout.renderers.PitchTickRenderer;
import org.jzy3d.ui.LookAndFeel;

/**
 * Showing a pair of 2d charts to represent pitch and amplitude variation of an
 * audio signal.
 * 
 * Noticed problems on chart resize. Suspect "wrong stuffs" around miglayout or jogl.
 * 
 * @author Martin Pernollet
 */
public class Chart2dDemo {
    public static float duration = 60f;
    /** milisecond distance between two generated samples*/
    public static int interval = 50;
    public static int maxfreq = 880;
    public static int nOctave = 5;

    public static void main(String[] args) throws Exception {
        PitchAmpliControlCharts log = new PitchAmpliControlCharts(duration, maxfreq, nOctave);
        new TimeChartWindow(log.getCharts());

        generateSamplesInTime(log);
        // generateSamples(log, 500000);
    }

    public static void generateSamples(PitchAmpliControlCharts log, int n) throws InterruptedException {
        System.out.println("will generate " + n + " samples");

        for (int i = 0; i < n; i++) {
            // Random audio info
            double pitch = Math.random() * maxfreq;
            double ampli = Math.random();

            // Add to time series
            log.seriePitch.add(time(n, i), pitch);
            log.serieAmpli.add(time(n, i), ampli);
        }
    }

    public static double time(int n, int i) {
        return ((double) i / n) * duration;
    }

    public static void generateSamplesInTime(PitchAmpliControlCharts log) throws InterruptedException {
        System.out.println("will generate approx. " + duration * 1000 / interval + " samples");

        start();

        while (elapsed() < duration) {
            // Random audio info
            double pitch = Math.random() * maxfreq;
            double ampli = Math.random();

            // Add to time series
            log.seriePitch.add(elapsed(), pitch);
            log.serieAmpli.add(elapsed(), ampli);

            // Wait a bit
            Thread.sleep(interval);
        }
    }

    /** Hold 2 charts, 2 time series, and 2 drawable lines */
    public static class PitchAmpliControlCharts {
        public Chart2d pitchChart;
        public Chart2d ampliChart;
        public Serie2d seriePitch;
        public Serie2d serieAmpli;
        public ConcurrentLineStrip pitchLineStrip;
        public ConcurrentLineStrip amplitudeLineStrip;

        public PitchAmpliControlCharts(float timeMax, int freqMax, int nOctave) {
            pitchChart = new Chart2d();
            pitchChart.asTimeChart(timeMax, 0, freqMax, "Time", "Frequency");

            IAxeLayout axe = pitchChart.getAxeLayout();
            axe.setYTickProvider(new PitchTickProvider(nOctave));
            axe.setYTickRenderer(new PitchTickRenderer());

            seriePitch = pitchChart.getSerie("frequency", Serie2d.Type.LINE);
            seriePitch.setColor(Color.BLUE);
            pitchLineStrip = (ConcurrentLineStrip) seriePitch.getDrawable();

            ampliChart = new Chart2d();
            ampliChart.asTimeChart(timeMax, 0, 1.1f, "Time", "Amplitude");
            serieAmpli = ampliChart.getSerie("amplitude", Serie2d.Type.LINE);
            serieAmpli.setColor(Color.RED);
            amplitudeLineStrip = (ConcurrentLineStrip) serieAmpli.getDrawable();
        }

        public List getCharts() {
            List charts = new ArrayList();
            charts.add(pitchChart);
            charts.add(ampliChart);
            return charts;
        }
    }

    /** A frame to show a list of charts */
    public static class TimeChartWindow extends JFrame {
        private static final long serialVersionUID = 7519209038396190502L;

        public TimeChartWindow(List charts) throws IOException {
            LookAndFeel.apply();
            String lines = "[300px]";
            String columns = "[500px,grow]";
            setLayout(new MigLayout("", columns, lines));
            int k = 0;
            for (Chart c : charts) {
                addChart(c, k++);
            }
            windowExitListener();
            this.pack();
            show();
            setVisible(true);
        }

        public void addChart(Chart chart, int id) {
            JPanel chartPanel = new JPanel(new BorderLayout());
            Border b = BorderFactory.createLineBorder(java.awt.Color.black);
            chartPanel.setBorder(b);
            chartPanel.add((java.awt.Component) chart.getCanvas(), BorderLayout.CENTER);
            add(chartPanel, "cell 0 " + id + ", grow");
        }

        public void windowExitListener() {
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    TimeChartWindow.this.dispose();
                    System.exit(0);
                }
            });
        }
    }

    /** Simple timer */
    protected static long start;

    public static void start() {
        start = System.nanoTime();
    }

    public static double elapsed() {
        return (System.nanoTime() - start) / 1000000000.0;
    }
}
 

Ads help maintain this website.