annotate audioio/ClipMixer.h @ 310:8c59cc68eabd tonioni

Initial implementation of clip note mix
author Chris Cannam
date Tue, 07 Jan 2014 17:11:14 +0000
parents 289d65722123
children faee60602049
rev   line source
Chris@305 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@305 2
Chris@305 3 /*
Chris@305 4 Sonic Visualiser
Chris@305 5 An audio file viewer and annotation editor.
Chris@305 6 Centre for Digital Music, Queen Mary, University of London.
Chris@305 7 This file copyright 2006 Chris Cannam, 2006-2014 QMUL.
Chris@305 8
Chris@305 9 This program is free software; you can redistribute it and/or
Chris@305 10 modify it under the terms of the GNU General Public License as
Chris@305 11 published by the Free Software Foundation; either version 2 of the
Chris@305 12 License, or (at your option) any later version. See the file
Chris@305 13 COPYING included with this distribution for more information.
Chris@305 14 */
Chris@305 15
Chris@305 16 #ifndef _CLIP_MIXER_H_
Chris@305 17 #define _CLIP_MIXER_H_
Chris@305 18
Chris@305 19 #include <QString>
Chris@305 20 #include <vector>
Chris@305 21
Chris@305 22 /**
Chris@305 23 * Mix in synthetic notes produced by resampling a prerecorded
Chris@305 24 * clip. That is, this is a sampler.
Chris@305 25 */
Chris@305 26
Chris@305 27 class ClipMixer
Chris@305 28 {
Chris@305 29 public:
Chris@305 30 ClipMixer(int channels, int sampleRate, int blockSize);
Chris@305 31 ~ClipMixer();
Chris@305 32
Chris@308 33 void setChannelCount(int channels);
Chris@308 34
Chris@305 35 bool loadClipData(QString clipFilePath, float clipF0);
Chris@305 36
Chris@308 37 void reset(); // discarding any playing notes
Chris@308 38
Chris@305 39 //!!! what can we find in common with the NoteData type and
Chris@305 40 //!!! AudioGenerator's NoteOff?
Chris@305 41
Chris@305 42 struct NoteStart {
Chris@310 43 int frameOffset; // within current processing block
Chris@305 44 float frequency; // Hz
Chris@305 45 float level; // volume in range (0,1]
Chris@305 46 float pan; // range [-1,1]
Chris@305 47 };
Chris@305 48
Chris@305 49 struct NoteEnd {
Chris@310 50 int frameOffset; // in current processing block
Chris@308 51 float frequency; // matching note start
Chris@305 52 };
Chris@305 53
Chris@305 54 void mix(float **toBuffers,
Chris@308 55 float gain,
Chris@305 56 std::vector<NoteStart> newNotes,
Chris@305 57 std::vector<NoteEnd> endingNotes);
Chris@305 58
Chris@305 59 private:
Chris@305 60 int m_channels;
Chris@305 61 int m_sampleRate;
Chris@305 62 int m_blockSize;
Chris@305 63
Chris@305 64 QString m_clipPath;
Chris@305 65
Chris@305 66 float *m_clipData;
Chris@305 67 int m_clipLength;
Chris@305 68 float m_clipF0;
Chris@305 69 float m_clipRate;
Chris@310 70
Chris@310 71 std::vector<NoteStart> m_playing;
Chris@310 72
Chris@310 73 float getResampleRatioFor(float frequency);
Chris@310 74 int getResampledClipDuration(float frequency);
Chris@310 75
Chris@310 76 void mixNote(float **toBuffers,
Chris@310 77 float *levels,
Chris@310 78 float frequency,
Chris@310 79 int sourceOffset, // within resampled note
Chris@310 80 int targetOffset, // within target buffer
Chris@310 81 int sampleCount);
Chris@305 82 };
Chris@305 83
Chris@305 84
Chris@305 85 #endif