shithub: aubio

ref: f88a3262187e339c5d65f07175fdc875bb4376c5
dir: /python/aubio/gnuplot.py/

View raw version
"""Copyright (C) 2004 Paul Brossier <piem@altern.org>
print aubio.__LICENSE__ for the terms of use
"""

__LICENSE__ = """\
	 Copyright (C) 2004 Paul Brossier <piem@altern.org>

	 This program is free software; you can redistribute it and/or modify
	 it under the terms of the GNU General Public License as published by
	 the Free Software Foundation; either version 2 of the License, or
	 (at your option) any later version.

	 This program is distributed in the hope that it will be useful,
	 but WITHOUT ANY WARRANTY; without even the implied warranty of
	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	 GNU General Public License for more details.

	 You should have received a copy of the GNU General Public License
	 along with this program; if not, write to the Free Software
	 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
"""

__notesheight = 0.25

from numarray import *
import Gnuplot, Gnuplot.funcutils

def plotnote(la,title=None) :
	if la[0,:].size() == 3:
	        d = plotnote_withends(la, plot_title=title)
	else: 
	    # scale data if in freq (for REF.txt files)
	    if max(la[:,1] > 128 ):
	        print "scaling frequency data to midi range"
	        la[:,1] /= 6.875
	        la[:,1] = log(la[:,1])/0.6931
	        la[:,1] *= 12
	        la[:,1] -= 3
	    d = plotnote_withoutends(la, plot_title=title)
	return d

def plotnote_multi(lalist,title=None,fileout=None) :
	d=list()
	for i in range(len(lalist)):
	    d.append(plotnote(lalist[i], title=title))
	return d
       

def plotnote_withends(la,plot_title=None) :
	d=[]
	x_widths = array(la[:,1]-la[:,0])/2.
	d.append(Gnuplot.Data(
	        la[:,0]+x_widths,               # x centers
	        la[:,2],                        # y centers
	        x_widths,                       # x errors
	        __notesheight*ones(len(la)),    # y errors
	        title=plot_title,with=('boxxyerrorbars fs 3')))
	return d


def plotnote_withoutends(la,plot_title=None) :
        """ bug: fails drawing last note """
        d=[]
        x_widths = array(la[1:,0]-la[:-1,0])/2;
        d.append(Gnuplot.Data(
                la[:-1,0]+x_widths,             # x centers
                la[:-1,1],                      # y centers
                x_widths,                       # x errors
                __notesheight*ones(len(la)-1),  # y errors
                title=plot_title,with=('boxxyerrorbars fs 3')))
        return d

def plotnote_do(d,fileout=None):
    g = Gnuplot.Gnuplot(debug=1, persist=1)
    g.gnuplot('set style fill solid border 1; \
    set size ratio 1/6; \
    set boxwidth 0.9 relative; \
    set mxtics 2.5; \
    set mytics 2.5; \
    set xtics 5; \
    set ytics 1; \
    set grid xtics ytics mxtics mytics')

    g.xlabel('Time (s)')
    g.ylabel('Midi pitch')
    # do the plot
    #g.gnuplot('set multiplot')
    #for i in d:
    g.plot(d[0])
    #g.gnuplot('set nomultiplot') 
    if fileout != None:
        g.hardcopy(fileout, enhanced=1, color=0)

def audio_to_array(filename):
	import aubio.aubioclass
	hopsize  = 2048
	filei    = aubio.aubioclass.sndfile(filename)
	framestep = 1/(filei.samplerate()+0.)
	channels = filei.channels()
	myvec    = aubio.aubioclass.fvec(hopsize,channels)
	data = []
	readsize = hopsize
	while (readsize==hopsize):
		readsize = filei.read(hopsize,myvec)
		#for i in range(channels):
		i = 0
		curpos = 0
		while (curpos < readsize):
			data.append(myvec.get(curpos,i))
			curpos+=1
	time = arange(len(data))*framestep
	return time,data

def plot_audio(filenames, fileout=None, start=0, end=None, noaxis=None):
	g = Gnuplot.Gnuplot(debug=1, persist=1)
	d = []
	todraw = len(filenames)
	xorig = 0.
	xsize = 1./todraw
	g.gnuplot('set multiplot;')
	while (len(filenames)):
                d.append(plot_audio_make(filenames.pop(0)))
		if not noaxis and todraw==1:
			g.xlabel('Time (s)')
			g.ylabel('Amplitude')
		g.gnuplot('set size %f,1.;' % (xsize) )
		g.gnuplot('set origin %f,0.;' % (xorig) )
		g.gnuplot('set style data lines; \
			set yrange [-1.:1.]; \
			set xrange [0:%f]' % b[-1]) 
		g.plot(d.pop(0))
		xorig += 1./todraw
	g.gnuplot('unset multiplot;')
	if fileout != None:
		g.hardcopy(fileout, enhanced=1, color=0)

def make_audio_plot(time,data,maxpoints=10000):
	""" create gnuplot plot from an audio file """
        import numarray
        length = len(time)
	downsample = length/maxpoints
        if downsample == 0: downsample = 1
        x = numarray.array(time).resize(length)[0:-1:downsample]
        y = numarray.array(data).resize(length)[0:-1:downsample]
	return Gnuplot.Data(x,y,with='lines')