merge aubionotes and aubionotesmedian
[aubio.git] / python / aubio / gnuplot.py
1 """Copyright (C) 2004 Paul Brossier <piem@altern.org>
2 print aubio.__LICENSE__ for the terms of use
3 """
4
5 __LICENSE__ = """\
6          Copyright (C) 2004 Paul Brossier <piem@altern.org>
7
8          This program is free software; you can redistribute it and/or modify
9          it under the terms of the GNU General Public License as published by
10          the Free Software Foundation; either version 2 of the License, or
11          (at your option) any later version.
12
13          This program is distributed in the hope that it will be useful,
14          but WITHOUT ANY WARRANTY; without even the implied warranty of
15          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16          GNU General Public License for more details.
17
18          You should have received a copy of the GNU General Public License
19          along with this program; if not, write to the Free Software
20          Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 """
22
23 __notesheight = 0.25
24
25 from numarray import *
26 import Gnuplot, Gnuplot.funcutils
27
28 def plotnote(la,title=None) :
29         if la[0,:].size() == 3:
30                 d = plotnote_withends(la, plot_title=title)
31         else: 
32             # scale data if in freq (for REF.txt files)
33             if max(la[:,1] > 128 ):
34                 print "scaling frequency data to midi range"
35                 la[:,1] /= 6.875
36                 la[:,1] = log(la[:,1])/0.6931
37                 la[:,1] *= 12
38                 la[:,1] -= 3
39             d = plotnote_withoutends(la, plot_title=title)
40         return d
41
42 def plotnote_multi(lalist,title=None,fileout=None) :
43         d=list()
44         for i in range(len(lalist)):
45             d.append(plotnote(lalist[i], title=title))
46         return d
47        
48
49 def plotnote_withends(la,plot_title=None) :
50         d=[]
51         x_widths = array(la[:,1]-la[:,0])/2.
52         d.append(Gnuplot.Data(
53                 la[:,0]+x_widths,               # x centers
54                 la[:,2],                        # y centers
55                 x_widths,                       # x errors
56                 __notesheight*ones(len(la)),    # y errors
57                 title=plot_title,with=('boxxyerrorbars fs 3')))
58         return d
59
60
61 def plotnote_withoutends(la,plot_title=None) :
62         """ bug: fails drawing last note """
63         d=[]
64         x_widths = array(la[1:,0]-la[:-1,0])/2;
65         d.append(Gnuplot.Data(
66                 la[:-1,0]+x_widths,             # x centers
67                 la[:-1,1],                      # y centers
68                 x_widths,                       # x errors
69                 __notesheight*ones(len(la)-1),  # y errors
70                 title=plot_title,with=('boxxyerrorbars fs 3')))
71         return d
72
73 def plotnote_do(d,fileout=None):
74     g = Gnuplot.Gnuplot(debug=1, persist=1)
75     g.gnuplot('set style fill solid border 1; \
76     set size ratio 1/6; \
77     set boxwidth 0.9 relative; \
78     set mxtics 2.5; \
79     set mytics 2.5; \
80     set xtics 5; \
81     set ytics 1; \
82     set grid xtics ytics mxtics mytics')
83
84     g.xlabel('Time (s)')
85     g.ylabel('Midi pitch')
86     # do the plot
87     #g.gnuplot('set multiplot')
88     #for i in d:
89     g.plot(d[0])
90     #g.gnuplot('set nomultiplot') 
91     if fileout != None:
92         g.hardcopy(fileout, enhanced=1, color=0)
93
94 def audio_to_array(filename):
95         import aubio.aubioclass
96         hopsize  = 2048
97         filei    = aubio.aubioclass.sndfile(filename)
98         framestep = 1/(filei.samplerate()+0.)
99         channels = filei.channels()
100         myvec    = aubio.aubioclass.fvec(hopsize,channels)
101         data = []
102         readsize = hopsize
103         while (readsize==hopsize):
104                 readsize = filei.read(hopsize,myvec)
105                 #for i in range(channels):
106                 i = 0
107                 curpos = 0
108                 while (curpos < readsize):
109                         data.append(myvec.get(curpos,i))
110                         curpos+=1
111         time = arange(len(data))*framestep
112         return time,data
113
114 def plot_audio(filenames, fileout=None, start=0, end=None, noaxis=None):
115         g = Gnuplot.Gnuplot(debug=1, persist=1)
116         d = []
117         todraw = len(filenames)
118         xorig = 0.
119         xsize = 1./todraw
120         g.gnuplot('set multiplot;')
121         while (len(filenames)):
122                 d.append(plot_audio_make(filenames.pop(0)))
123                 if not noaxis and todraw==1:
124                         g.xlabel('Time (s)')
125                         g.ylabel('Amplitude')
126                 g.gnuplot('set size %f,1.;' % (xsize) )
127                 g.gnuplot('set origin %f,0.;' % (xorig) )
128                 g.gnuplot('set style data lines; \
129                         set yrange [-1.:1.]; \
130                         set xrange [0:%f]' % b[-1]) 
131                 g.plot(d.pop(0))
132                 xorig += 1./todraw
133         g.gnuplot('unset multiplot;')
134         if fileout != None:
135                 g.hardcopy(fileout, enhanced=1, color=0)
136
137 def make_audio_plot(time,data,maxpoints=10000):
138         """ create gnuplot plot from an audio file """
139         import numarray
140         length = len(time)
141         downsample = length/maxpoints
142         if downsample == 0: downsample = 1
143         x = numarray.array(time).resize(length)[0:-1:downsample]
144         y = numarray.array(data).resize(length)[0:-1:downsample]
145         return Gnuplot.Data(x,y,with='lines')