Mercurial > hg > svgui
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; + */ +} +