| cannam@85 | 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | 
| cannam@85 | 2 <HTML> | 
| cannam@85 | 3 | 
| cannam@85 | 4 <HEAD> | 
| cannam@85 | 5 	<TITLE> | 
| cannam@85 | 6 	libsndfile and GNU Octave | 
| cannam@85 | 7 	</TITLE> | 
| cannam@85 | 8 	<META NAME="Author"      CONTENT="Erik de Castro Lopo (erikd AT mega-nerd DOT com)"> | 
| cannam@85 | 9 	<LINK REL="stylesheet" HREF="libsndfile.css" TYPE="text/css" MEDIA="all"> | 
| cannam@85 | 10 	<LINK REL="stylesheet" HREF="print.css" TYPE="text/css" MEDIA="print"> | 
| cannam@85 | 11 </HEAD> | 
| cannam@85 | 12 | 
| cannam@85 | 13 <BODY> | 
| cannam@85 | 14 | 
| cannam@85 | 15 <BR> | 
| cannam@85 | 16 <H1><B>libsndfile and GNU Octave</B></H1> | 
| cannam@85 | 17 <P> | 
| cannam@85 | 18 	<A HREF="http://www.octave.org/">GNU Octave</A> is a high-level interactive | 
| cannam@85 | 19 	language for numerical computations. | 
| cannam@85 | 20 	There are currently two development streams, a stable 2.0.X series and a | 
| cannam@85 | 21 	development 2.1.X series. | 
| cannam@85 | 22 	Octave reads and writes data in binary formats that were originally developed | 
| cannam@85 | 23 	for | 
| cannam@85 | 24 		<A HREF="http://www.mathworks.com/">MATLAB</A>. | 
| cannam@85 | 25 	Version 2.0.X of Octave uses binary data files compatible with MATLAB | 
| cannam@85 | 26 	version 4.2 while Octave 2.1.X uses binary data files compatible | 
| cannam@85 | 27 	with MATLAB version 5.0 as well as being able to read the older MATLAB 4.2 | 
| cannam@85 | 28 	format. | 
| cannam@85 | 29 </P> | 
| cannam@85 | 30 <P> | 
| cannam@85 | 31 	From version 1.0.1 of libsndfile onwards, libsndfile has the ability of reading | 
| cannam@85 | 32 	and writing a small subset of the binary data files used by both versions | 
| cannam@85 | 33 	of GNU Octave. | 
| cannam@85 | 34 	This gives people using GNU Octave for audio based work an easy method of | 
| cannam@85 | 35 	moving audio data between GNU Octave and other programs which use libsndfile. | 
| cannam@85 | 36 </P> | 
| cannam@85 | 37 <P> | 
| cannam@85 | 38 	For instance it is now possible to do the following: | 
| cannam@85 | 39 </P> | 
| cannam@85 | 40 | 
| cannam@85 | 41 	<UL> | 
| cannam@85 | 42 	<LI> Load a WAV file into a sound file editor such as | 
| cannam@85 | 43 		<A HREF="http://www.metadecks.org/software/sweep/">Sweep</A>. | 
| cannam@85 | 44 	<LI> Save it as a MAT4 file. | 
| cannam@85 | 45 	<LI> Load the data into Octave for manipulation. | 
| cannam@85 | 46 	<LI> Save the modified data. | 
| cannam@85 | 47 	<LI> Reload it in Sweep. | 
| cannam@85 | 48 	</UL> | 
| cannam@85 | 49 <P> | 
| cannam@85 | 50 	Another example would be using the MAT4 or MAT5 file formats as a format which | 
| cannam@85 | 51 	can be easily loaded into Octave for viewing/analyzing as well as a format | 
| cannam@85 | 52 	which can be played with command line players such as the one included with | 
| cannam@85 | 53 	libsndfile. | 
| cannam@85 | 54 </P> | 
| cannam@85 | 55 | 
| cannam@85 | 56 <H2><B>Details</B></H2> | 
| cannam@85 | 57 <P> | 
| cannam@85 | 58 	Octave, like most programming languages, uses variables to store data, and | 
| cannam@85 | 59 	Octave variables can contain both arrays and matrices. | 
| cannam@85 | 60 	It is also able to store one or more of these variables in a file. | 
| cannam@85 | 61 	When reading Octave files, libsndfile expects a file to contain two | 
| cannam@85 | 62 	variables and their associated data. | 
| cannam@85 | 63 	The first variable should contain a variable holding the file sample rate | 
| cannam@85 | 64 	while the second variable contains the audio data. | 
| cannam@85 | 65 </P> | 
| cannam@85 | 66 <P> | 
| cannam@85 | 67 	For example, to generate a sine wave and store it as a binary file which | 
| cannam@85 | 68 	is compatible with libsndfile, do the following: | 
| cannam@85 | 69 </P> | 
| cannam@85 | 70 <PRE> | 
| cannam@85 | 71         octave:1 > samplerate = 44100 ; | 
| cannam@85 | 72         octave:2 > wavedata = sin ((0:1023)*2*pi/1024) ; | 
| cannam@85 | 73         octave:3 > save sine.mat samplerate wavedata | 
| cannam@85 | 74 </PRE> | 
| cannam@85 | 75 | 
| cannam@85 | 76 <P> | 
| cannam@85 | 77 	The process of reading and writing files compatible with libsndfile can be | 
| cannam@85 | 78 	made easier by use of two Octave script files : | 
| cannam@85 | 79 </P> | 
| cannam@85 | 80 <PRE> | 
| cannam@85 | 81         octave:4 > [data fs] = sndfile_load ("sine.mat") ; | 
| cannam@85 | 82         octave:5 > sndfile_save ("sine2.mat", data, fs) ; | 
| cannam@85 | 83 </PRE> | 
| cannam@85 | 84 <P> | 
| cannam@85 | 85 	In addition, libsndfile contains a command line program which which is able | 
| cannam@85 | 86 	to play the correct types of Octave files. | 
| cannam@85 | 87 	Using this command line player <B>sndfile-play</B> and a third Octave script | 
| cannam@85 | 88 	file allows Octave data to be played from within Octave on any of the platforms | 
| cannam@85 | 89 	which <B>sndfile-play</B> supports (at the moment: Linux, MacOS X, Solaris and | 
| cannam@85 | 90 	Win32). | 
| cannam@85 | 91 </P> | 
| cannam@85 | 92 <PRE> | 
| cannam@85 | 93         octave:6 > sndfile_play (data, fs) ; | 
| cannam@85 | 94 </PRE> | 
| cannam@85 | 95 <P> | 
| cannam@85 | 96 	These three Octave scripts are installed automatically in Octave's site | 
| cannam@85 | 97 	script directory when libsndfile is installed (except on Win32) ie when | 
| cannam@85 | 98 	libsndfile is being installed into /usr/local, the Octave scripts will | 
| cannam@85 | 99 	be installed in /usr/local/share/octave/site/m/. | 
| cannam@85 | 100 </P> | 
| cannam@85 | 101 | 
| cannam@85 | 102 <P> | 
| cannam@85 | 103 	There are some other Octave scripts for audio to be found | 
| cannam@85 | 104 		<A HREF="http://octave.sourceforge.net/index/audio.html">here</A>. | 
| cannam@85 | 105 </P> | 
| cannam@85 | 106 | 
| cannam@85 | 107 <BR> | 
| cannam@85 | 108 <!-- ========================================================================= --> | 
| cannam@85 | 109 | 
| cannam@85 | 110 <HR> | 
| cannam@85 | 111 <P> | 
| cannam@85 | 112 	The libsndfile home page is here : | 
| cannam@85 | 113 		<A HREF="http://www.mega-nerd.com/libsndfile/"> | 
| cannam@85 | 114 			http://www.mega-nerd.com/libsndfile/</A>. | 
| cannam@85 | 115 </P> | 
| cannam@85 | 116 | 
| cannam@85 | 117 </BODY> | 
| cannam@85 | 118 </HTML> |