[Clam-devel] pyclam: CLAM python bindings (some preliminary results)

Hernán Ordiales h at ordia.com.ar
Wed Jul 30 12:36:50 PDT 2008


Hi all,

Recently I been playing a little with Boost.Python and CLAM library
and I'd like to show you the results:

By now I was able to parse with sucess only a subset of clam classes
and the problems that arose with basic ones were temporary solved with
a couple of workarounds (especially because dynamic types), but I
believe those issues could be solved in a better way with more work on
it.

If you agree and like the idea, let me know and i'll upload my work to
the repo along with some instrucctions to get it running.

This is how the python code looks like at the moment:
(fft_example.py)

import clam
from math import sin

samples = 1024
sampleRate = 8000.0
sineFreq = 400.0

myaudio = clam.Audio()
myaudio.SetSize( samples );
myaudio.SetSampleRate( sampleRate );

vector = myaudio.GetBuffer()
for i in range(samples):
	vector.set( i, 0.625+0.5*sin(2.0*sineFreq*400.0*((float(i))/sampleRate)) )
	#print vector[i]

myspectrum = clam.Spectrum()
specFlags = clam.SpecTypeFlags()

specFlags.SetFlag( specFlags.GetFlagPosition("Polar"), 1 )
specFlags.SetFlag( specFlags.GetFlagPosition("Complex"), 1 )
specFlags.SetFlag( specFlags.GetFlagPosition("MagPhase"), 1 )
specFlags.SetFlag( specFlags.GetFlagPosition("Polar"), 1 )
specFlags.SetFlag( specFlags.GetFlagPosition("MagPhaseBPF"), 1 )

myspectrum.SetType( specFlags )
myspectrum.SetSize( samples/2+1 )

fconfig = clam.FFTConfig()
fconfig.SetAudioSize( samples )

myfft = clam.FFT_ooura()
myfft.Configure( fconfig.getReal() )
myfft.Start()

print "Running object "
myfft.Do( myaudio.getBase(), myspectrum.getBase() )

print "Storing spectrum"
clam.XmlStorage.Dump( clam.toComponent(myspectrum), "FFTResult",
"pyFFT_example.xml")
------

Other example:
(playfile.py)

import clam
import time

filename = "./test30seg.mp3"

network = clam.Network()

reader = network.AddProcessing( "MonoAudioFileReader" )
config = clam.MonoAudioFileReaderConfig()
config.SetSourceFile( filename )
if not network.ConfigureProcessing(reader, config): print "Could not
open the file"

sink = network.AddProcessing( "AudioSink" )

network.ConnectPorts( reader+".Samples Read", sink+".AudioIn" )

portaudio_player = clam.PANetworkPlayer()
network.SetPlayer( portaudio_player );

network.Start()
time.sleep( clam.MonoAudioFileReader( network.GetProcessing(reader)
).GetLength() )
network.Stop()
------

The current available "namespace" of clam bindings:

clam.Audio                      clam.MonoAudioFileReader        clam.__file__
clam.Component                  clam.MonoAudioFileReaderConfig
clam.__getattribute__
clam.ConnectControls            clam.Network                    clam.__hash__
clam.ConnectPorts               clam.NetworkPlayer              clam.__init__
clam.ConnectTypedControls       clam.PANetworkPlayer            clam.__name__
clam.DataArray                  clam.Processing                 clam.__new__
clam.EFFTType                   clam.ProcessingConfig           clam.__reduce__
clam.Enum                       clam.ProcessingData
clam.__reduce_ex__
clam.Err                        clam.SendFloatToInControl       clam.__repr__
clam.ErrNotFound                clam.SendFloatToOutControl      clam.__setattr__
clam.FFT                        clam.SpecTypeFlags              clam.__str__
clam.FFTConfig                  clam.Spectrum                   clam.eFFT_IUA
clam.FFT_base                   clam.Storage                    clam.eFFT_NREC
clam.FFT_ooura                  clam.XmlStorage                 clam.eNone
clam.FlagsBase                  clam.__class__                  clam.eRFFTW
clam.Flags_less__4u__grate_     clam.__delattr__                clam.so
clam.GetFloatFromInControl      clam.__dict__                   clam.toComponent
clam.IllegalValue               clam.__doc__

Let me know.

Cheers.
-- 
Hernán
http://h.ordia.com.ar
GnuPG: 0xEE8A3FE9




More information about the clam-devel mailing list