diff layer/Colour3DPlotExporter.cpp @ 1554:a0b2f3b4dd2f spectrogram-export

Start work on spectrogram export code
author Chris Cannam
date Mon, 06 Jan 2020 14:46:25 +0000
parents
children ac8da42674ff
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/layer/Colour3DPlotExporter.cpp	Mon Jan 06 14:46:25 2020 +0000
@@ -0,0 +1,107 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    
+    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.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "Colour3DPlotExporter.h"
+
+#include "data/model/EditableDenseThreeDimensionalModel.h"
+#include "data/model/FFTModel.h"
+
+#include "VerticalBinLayer.h"
+
+QString
+Colour3DPlotExporter::toDelimitedDataString(QString delimiter,
+                                            DataExportOptions options,
+                                            sv_frame_t startFrame,
+                                            sv_frame_t duration) const
+{
+    QMutexLocker locker(&m_mutex);
+
+    BinDisplay binDisplay = m_params.binDisplay;
+
+    auto model =
+        ModelById::getAs<DenseThreeDimensionalModel>(m_sources.source);
+    auto fftModel =
+        ModelById::getAs<FFTModel>(m_sources.fft);
+
+    auto layer = m_sources.verticalBinLayer;
+    auto provider = m_sources.provider;
+
+    if (!model || !layer) {
+        SVCERR << "ERROR: Colour3DPlotExporter::toDelimitedDataString: Source model and layer required" << endl;
+        return {};
+    }
+
+    int minbin = 0;
+    int sh = model->getHeight();
+    int nbins = sh;
+
+    //!!! todo: consider what to do about the actual Colour 3D Plot
+    //!!! Layer. In the existing application, this is exported full
+    //!!! height. If we switch to using this code, we will be
+    //!!! exporting only the displayed height. This is backward
+    //!!! incompatible, but also not directly interpretable without
+    //!!! any guide in the exported file as to what the bin indices
+    //!!! are. Perhaps we should have a flag to export full height,
+    //!!! and default to using it.
+
+    //!!! todo: what about the other export types besides
+    //!!! delimited-data-string ?
+    
+    if (provider) {
+
+        minbin = layer->getIBinForY(provider, provider->getPaintHeight());
+        if (minbin >= sh) minbin = sh - 1;
+        if (minbin < 0) minbin = 0;
+    
+        nbins = layer->getIBinForY(provider, 0) - minbin + 1;
+        if (minbin + nbins > sh) nbins = sh - minbin;
+    }
+
+    int w = model->getWidth();
+
+    QString s;
+    
+    for (int i = 0; i < w; ++i) {
+        sv_frame_t fr = model->getStartFrame() + i * model->getResolution();
+        if (fr < startFrame || fr >= startFrame + duration) {
+            continue;
+        }
+        QStringList list;
+
+        //...
+
+        s += list.join(delimiter) + "\n";
+    }
+
+    return s;
+    
+
+    //!!! For reference, this is the body of
+    //!!! EditableDenseThreeDimensionalModel::toDelimitedDataString
+    /*
+    QString s;
+    for (int i = 0; in_range_for(m_data, i); ++i) {
+        sv_frame_t fr = m_startFrame + i * m_resolution;
+        if (fr >= startFrame && fr < startFrame + duration) {
+            QStringList list;
+            for (int j = 0; in_range_for(m_data.at(i), j); ++j) {
+                list << QString("%1").arg(m_data.at(i).at(j));
+            }
+            s += list.join(delimiter) + "\n";
+        }
+    }
+    return s;
+    */    
+}
+