summaryrefslogtreecommitdiff
path: root/src/loris/SdifFile.h
diff options
context:
space:
mode:
authorJohn Glover <glover.john@gmail.com>2011-07-08 18:06:21 +0100
committerJohn Glover <glover.john@gmail.com>2011-07-08 18:06:21 +0100
commitd6073e01c933c77f1e2bc3c3fe1126d617003549 (patch)
tree695d23677c5b84bf3a0f88fbd4959b4f7cbc0e90 /src/loris/SdifFile.h
parent641688b252da468eb374674a0dbaae1bbac70b2b (diff)
downloadsimpl-d6073e01c933c77f1e2bc3c3fe1126d617003549.tar.gz
simpl-d6073e01c933c77f1e2bc3c3fe1126d617003549.tar.bz2
simpl-d6073e01c933c77f1e2bc3c3fe1126d617003549.zip
Start adding Loris files
Diffstat (limited to 'src/loris/SdifFile.h')
-rw-r--r--src/loris/SdifFile.h245
1 files changed, 245 insertions, 0 deletions
diff --git a/src/loris/SdifFile.h b/src/loris/SdifFile.h
new file mode 100644
index 0000000..8408c28
--- /dev/null
+++ b/src/loris/SdifFile.h
@@ -0,0 +1,245 @@
+/*
+ * This is the Loris C++ Class Library, implementing analysis,
+ * manipulation, and synthesis of digitized sounds using the Reassigned
+ * Bandwidth-Enhanced Additive Sound Model.
+ *
+ * Loris is Copyright (c) 1999-2010 by Kelly Fitz and Lippold Haken
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ *
+ * SdifFile.h
+ *
+ * Definition of SdifFile class for Partial import and export in Loris.
+ *
+ * Kelly Fitz, 8 Jan 2003
+ * loris@cerlsoundgroup.org
+ *
+ * http://www.cerlsoundgroup.org/Loris/
+ *
+ */
+
+#include "Marker.h"
+#include "Partial.h"
+#include "PartialList.h"
+
+#include <string>
+#include <vector>
+
+// begin namespace
+namespace Loris {
+
+// ---------------------------------------------------------------------------
+// class SdifFile
+//
+//! Class SdifFile represents reassigned bandwidth-enhanced Partial
+//! data in a SDIF-format data file. Construction of an SdifFile
+//! from a stream or filename automatically imports the Partial
+//! data.
+//!
+//! Loris stores partials in SDIF RBEP and RBEL frames. The RBEP and RBEL
+//! frame and matrix definitions are included in the SDIF file's header.
+//! Each RBEP frame contains one RBEP matrix, and each row in a RBEP matrix
+//! describes one breakpoint in a Loris partial. The data in RBEP matrices
+//! are SDIF 32-bit floats.
+//!
+//! The six columns in an RBEP matrix are: partialIndex, frequency,
+//! amplitude, phase, noise, timeOffset. The partialIndex uniquely
+//! identifies a partial. When Loris exports SDIF data, each partial is
+//! assigned a unique partialIndex. The frequency (Hz), amplitude (0..1),
+//! phase (radians), and noise (bandwidth) are encoded the same as Loris
+//! breakpoints. The timeOffset is an offset from the RBEP frame time,
+//! specifying the exact time of the breakpoint. Loris always specifies
+//! positive timeOffsets, and the breakpoint's exact time is always be
+//! earlier than the next RBEP frame's time.
+//!
+//! Since reassigned bandwidth-enhanced partial breakpoints are
+//! non-uniformly spaced in time, the RBEP frame times are also
+//! non-uniformly spaced. Each RBEP frame will contain at most one
+//! breakpoint for any given partial. A partial may extend over a RBEP frame
+//! and have no breakpoint specified by the RBEP frame, as happens when one
+//! active partial has a lower temporal density of breakpoints than other
+//! active partials.
+//!
+//! If partials have nonzero labels in Loris, then a RBEL frame describing
+//! the labeling of the partials will precede the first RBEP frame in the
+//! SDIF file. The RBEL frame contains a single, two-column RBEL matrix The
+//! first column is the partialIndex, and the second column specifies the
+//! label for the partial.
+//!
+//! If markers are associated with the partials in Loris, then a RBEM frame
+//! describing the markers will precede the first RBEP frame in the SDIF
+//! file. The RBEM frame contains two single-column RBEM matrices. The
+//! first matrix contains 32-bit floats indicating the time (in seconds)
+//! for each marker. The second matrix contains UTF-8 data, the names of
+//! each of the markers separated by the ASCII character 0.
+//!
+//! In addition to RBEP frames, Loris can also read and write SDIF 1TRC
+//! frames (refer to IRCAM's SDIF web site, www.ircam.fr/sdif/, for
+//! definitions of standard SDIF description types). Since 1TRC frames do
+//! not represent bandwidth-enhancement or the exact timing of Loris
+//! breakpoints, their use is not recommended. 1TRC capabilities are
+//! provided in Loris to allow interchange with programs that are unable to
+//! interpret RBEP frames.
+//
+class SdifFile
+{
+// -- public interface --
+public:
+
+// -- types --
+
+ //! The type of marker storage in an SdifFile.
+ typedef std::vector< Marker > markers_type;
+
+ //! The type of the Partial storage in an AiffFile.
+ typedef PartialList partials_type;
+
+// -- construction --
+
+ //! Initialize an instance of SdifFile by importing Partial data from
+ //! the file having the specified filename or path.
+ explicit SdifFile( const std::string & filename );
+
+ //! Initialize an instance of SdifFile with copies of the Partials
+ //! on the specified half-open (STL-style) range.
+ //!
+ //! If compiled with NO_TEMPLATE_MEMBERS defined, this member accepts
+ //! only PartialList::const_iterator arguments.
+#if !defined(NO_TEMPLATE_MEMBERS)
+ template<typename Iter>
+ SdifFile( Iter begin_partials, Iter end_partials );
+#else
+ SdifFile( PartialList::const_iterator begin_partials,
+ PartialList::const_iterator end_partials );
+#endif
+
+ //! Initialize an empty instance of SdifFile having no Partials.
+ SdifFile( void );
+
+ // copy, assign, and delete are compiler-generated
+
+// -- access --
+
+ //! Return a reference to the Markers (see Marker.h)
+ //! for this SdifFile.
+ markers_type & markers( void );
+
+ //! Return a reference to the Markers (see Marker.h)
+ //! for this SdifFile.
+ const markers_type & markers( void ) const;
+
+ //! Return a reference to the bandwidth-enhanced
+ //! Partials represented by this SdifFile.
+ partials_type & partials( void );
+
+ //! Return a reference to the bandwidth-enhanced
+ //! Partials represented by this SdifFile.
+ const partials_type & partials( void ) const;
+// -- mutation --
+
+ //! Add a copy of the specified Partial to this SdifFile.
+ void addPartial( const Loris::Partial & p );
+
+ //! Add a copy of each Partial on the specified half-open (STL-style)
+ //! range to this SdifFile.
+ //!
+ //! If compiled with NO_TEMPLATE_MEMBERS defined, this member accepts
+ //! only PartialList::const_iterator arguments.
+#if !defined(NO_TEMPLATE_MEMBERS)
+ template<typename Iter>
+ void addPartials( Iter begin_partials, Iter end_partials );
+#else
+ void addPartials( PartialList::const_iterator begin_partials,
+ PartialList::const_iterator end_partials );
+#endif
+
+// -- export --
+
+ //! Export the envelope Partials represented by this SdifFile to
+ //! the file having the specified filename or path.
+ void write( const std::string & path );
+
+ //! Export the envelope Partials represented by this SdifFile to
+ //! the file having the specified filename or path in the 1TRC
+ //! format, resampled, and without phase or bandwidth information.
+ void write1TRC( const std::string & path );
+
+// -- legacy export --
+
+ //! Export the Partials in the specified PartialList to a SDIF file having
+ //! the specified file name or path. If enhanced is true (the default),
+ //! reassigned bandwidth-enhanced Partial data are exported in the
+ //! six-column RBEP format. Otherwise, the Partial data is exported as
+ //! resampled sinusoidal analysis data in the 1TRC format.
+ //! Provided for backwards compatability.
+ //!
+ //! \deprecated This function is included only for legacy support
+ //! and may be removed at any time.
+ static void Export( const std::string & filename,
+ const PartialList & plist,
+ const bool enhanced = true );
+
+private:
+// -- implementation --
+ partials_type partials_; // Partials to store in SDIF format
+ markers_type markers_; // AIFF Markers
+
+}; // end of class SdifFile
+
+// -- template members --
+
+// ---------------------------------------------------------------------------
+// constructor from Partial range
+// ---------------------------------------------------------------------------
+// Initialize an instance of SdifFile with copies of the Partials
+// on the specified half-open (STL-style) range.
+//
+// If compiled with NO_TEMPLATE_MEMBERS defined, this member accepts
+// only PartialList::const_iterator arguments.
+//
+#if !defined(NO_TEMPLATE_MEMBERS)
+template< typename Iter >
+SdifFile::SdifFile( Iter begin_partials, Iter end_partials )
+#else
+SdifFile::SdifFile( PartialList::const_iterator begin_partials,
+ PartialList::const_iterator end_partials )
+#endif
+{
+ addPartials( begin_partials, end_partials );
+}
+
+// ---------------------------------------------------------------------------
+// addPartials
+// ---------------------------------------------------------------------------
+// Add a copy of each Partial on the specified half-open (STL-style)
+// range to this SdifFile.
+//
+// If compiled with NO_TEMPLATE_MEMBERS defined, this member accepts
+// only PartialList::const_iterator arguments.
+//
+#if !defined(NO_TEMPLATE_MEMBERS)
+template<typename Iter>
+void SdifFile::addPartials( Iter begin_partials, Iter end_partials )
+#else
+void SdifFile::addPartials( PartialList::const_iterator begin_partials,
+ PartialList::const_iterator end_partials )
+#endif
+{
+ partials_.insert( partials_.end(), begin_partials, end_partials );
+}
+
+} // end of namespace Loris
+