summaryrefslogtreecommitdiff
path: root/dgedit/audioextractor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dgedit/audioextractor.cc')
-rw-r--r--dgedit/audioextractor.cc283
1 files changed, 0 insertions, 283 deletions
diff --git a/dgedit/audioextractor.cc b/dgedit/audioextractor.cc
deleted file mode 100644
index 71e0b2a..0000000
--- a/dgedit/audioextractor.cc
+++ /dev/null
@@ -1,283 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- * audioextractor.cc
- *
- * Sat Nov 21 13:09:35 CET 2009
- * Copyright 2009 Bent Bisballe Nyeng
- * deva@aasimon.org
- ****************************************************************************/
-
-/*
- * This file is part of DrumGizmo.
- *
- * DrumGizmo 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.
- *
- * DrumGizmo 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 DrumGizmo; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-#include "audioextractor.h"
-
-#include <QDomDocument>
-#include <QFile>
-#include <QDir>
-#include <QApplication>
-
-#include <sndfile.h>
-
-#define INSTRUMENT_VERSION "2.0"
-
-typedef struct {
- SNDFILE *fh;
- float *data;
-} audiodata_t;
-
-AudioExtractor::AudioExtractor(Selections &s, QObject *parent)
- : QObject(parent), selections(s)
-{
-}
-
-void AudioExtractor::exportSelections()
-{
- emit setMaximumProgress(selections.ids().size() + 1/* for xml writing*/);
- int progress = 0;
- emit progressUpdate(progress++);
- qApp->processEvents();
-
- // Open all input audio files:
- audiodata_t audiodata[audiofiles.size()];
-
- int idx = 0;
- AudioFileList::iterator j = audiofiles.begin();
- while(j != audiofiles.end()) {
- QString file = j->first;
-
- SF_INFO sf_info;
- audiodata[idx].fh = sf_open(file.toStdString().c_str(), SFM_READ, &sf_info);
- if(!audiodata[idx].fh) {
- printf("Load error '%s'\n", file.toStdString().c_str());
- return;
- }
-
- audiodata[idx].data = NULL;
-
- j++;
- idx++;
- }
-
- idx = 1;
- QVector<sel_id_t> sels = selections.ids();
-
- // Sort selections by velocity
- for(int v1 = 0; v1 < sels.size(); v1++) {
- for(int v2 = 0; v2 < sels.size(); v2++) {
-
- Selection sel1 = selections.get(sels[v1]);
- Selection sel2 = selections.get(sels[v2]);
-
- if(sel1.energy < sel2.energy) {
- sel_id_t vtmp = sels[v1];
- sels[v1] = sels[v2];
- sels[v2] = vtmp;
- }
- }
- }
-
- // Iterate and write audio files
- QVector<sel_id_t>::iterator si = sels.begin();
- while(si != sels.end()) {
- Selection sel = selections.get(*si);
- size_t offset = sel.from;
- size_t size = sel.to - sel.from;
- size_t fadein = sel.fadein;
- size_t fadeout = sel.fadeout;
-
-
- // Read all input audio file chunks:
- for(int i = 0; i < audiofiles.size(); i++) {
-
- // Clear out old buffer (if one exists)
- if(audiodata[i].data) {
- delete audiodata[i].data;
- audiodata[i].data = NULL;
- }
-
- SNDFILE *fh = audiodata[i].fh;
-
- sf_seek(fh, offset, SEEK_SET);
-
- float *data = new float[size];
- sf_read_float(fh, data, size);
-
- // Apply linear fadein
- for(size_t fi = 0; fi < fadein; fi++) {
- float val = ((float)fi / (float)fadein);
- if(fi < size) data[fi] *= val;
- }
-
- // Apply fadeout
- for(size_t fo = 0; fo < fadeout; fo++) {
- float val = 1.0 - ((float)fo / (float)fadeout);
- if( (((size - fadeout) + fo) < size) &&
- (((size - fadeout) + fo) >= 0) ) {
- data[(size - fadeout) + fo] *= val;
- }
- }
-
- audiodata[i].data = data;
- }
-
- // Create output path:
- QString path = exportpath + "/" + prefix + "/samples";
- QDir d;
- d.mkpath(path);
-
- // Write all sample chunks to single output file:
- QString file = path + "/" + QString::number(idx) + "-" + prefix + ".wav";
-
- SF_INFO sf_info;
- sf_info.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT;
- sf_info.samplerate = 44100;
- sf_info.channels = audiofiles.size();
-
- SNDFILE *ofh = sf_open(file.toStdString().c_str(), SFM_WRITE, &sf_info);
- if(!ofh) {
- printf("Open for write error...\n");
- return;
- }
-
- for(size_t ob = 0; ob < size; ob++) {
- float obuf[audiofiles.size()];
- for(int ai = 0; ai < audiofiles.size(); ai++) {
- obuf[ai] = audiodata[ai].data[ob];
- }
- sf_write_float(ofh, obuf, audiofiles.size());
- }
- sf_close(ofh);
-
- idx++;
- si++;
-
- emit progressUpdate(progress++);
- qApp->processEvents();
- }
-
- // Close all input audio files:
- for(int i = 0; i < audiofiles.size(); i++) {
- if(audiodata[i].data) {
- delete audiodata[i].data;
- audiodata[i].data = NULL;
- }
-
- sf_close(audiodata[i].fh);
- }
-
- QDomDocument doc;
- QDomProcessingInstruction header =
- doc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
- doc.appendChild(header);
-
- QDomElement instrument = doc.createElement("instrument");
- instrument.setAttribute("version", INSTRUMENT_VERSION);
- instrument.setAttribute("name", prefix);
- doc.appendChild(instrument);
-
- QDomElement samples = doc.createElement("samples");
- instrument.appendChild(samples);
-
- {
- // Do the adding to the xml file one sample at the time.
- int index = 0;
- QVector<sel_id_t>::iterator si = sels.begin();
- while(si != sels.end()) {
- index++;
-
- Selection i = selections.get(*si);
- i.name = prefix + "-" + QString::number(index);
-
- QDomElement sample = doc.createElement("sample");
- sample.setAttribute("name", i.name);
- sample.setAttribute("power", QString::number(i.energy));
- samples.appendChild(sample);
-
- selections.update(*si, i);
-
- int channelnum = 1; // Filechannel numbers are 1-based.
- AudioFileList::iterator j = audiofiles.begin();
- while(j != audiofiles.end()) {
-
- QString file = j->first;
- QString name = j->second;
-
- QDomElement audiofile = doc.createElement("audiofile");
- audiofile.setAttribute("file", "samples/" +
- QString::number(index) + "-" + prefix + ".wav");
- audiofile.setAttribute("channel", name);
- audiofile.setAttribute("filechannel", QString::number(channelnum));
- sample.appendChild(audiofile);
- channelnum++;
- j++;
- }
-
- si++;
- }
- }
-
- QFile xmlfile(exportpath + "/" + prefix + "/" + prefix + ".xml");
- xmlfile.open(QIODevice::WriteOnly);
- xmlfile.write(doc.toByteArray());
- xmlfile.close();
-
- emit progressUpdate(progress++);
- qApp->processEvents();
-}
-
-void AudioExtractor::addFile(QString file, QString name)
-{
- QPair<QString, QString> pair;
- pair.first = file;
- pair.second = name;
- audiofiles.push_back(pair);
-}
-
-void AudioExtractor::removeFile(QString file, QString name)
-{
- AudioFileList::iterator j = audiofiles.begin();
- while(j != audiofiles.end()) {
- if(file == j->first/* && name == j->second*/) {
- audiofiles.erase(j);
- return;
- }
- j++;
- }
-}
-
-void AudioExtractor::setOutputPrefix(const QString &p)
-{
- prefix = p;
-}
-
-void AudioExtractor::setExportPath(const QString &path)
-{
- exportpath = path;
-}
-
-void AudioExtractor::changeName(QString file, QString name)
-{
- AudioFileList::iterator j = audiofiles.begin();
- while(j != audiofiles.end()) {
- if(file == j->first) {
- j->second = name;
- return;
- }
- j++;
- }
-}