cannam@95: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@95: cannam@95: /* cannam@95: Rubber Band Library cannam@95: An audio time-stretching and pitch-shifting library. cannam@95: Copyright 2007-2012 Particular Programs Ltd. cannam@95: cannam@95: This program is free software; you can redistribute it and/or cannam@95: modify it under the terms of the GNU General Public License as cannam@95: published by the Free Software Foundation; either version 2 of the cannam@95: License, or (at your option) any later version. See the file cannam@95: COPYING included with this distribution for more information. cannam@95: cannam@95: Alternatively, if you have a valid commercial licence for the cannam@95: Rubber Band Library obtained by agreement with the copyright cannam@95: holders, you may redistribute and/or modify it under the terms cannam@95: described in that licence. cannam@95: cannam@95: If you wish to distribute code using the Rubber Band Library cannam@95: under terms other than those of the GNU General Public License, cannam@95: you must obtain a valid commercial licence before doing so. cannam@95: */ cannam@95: cannam@95: #ifndef _RUBBERBAND_PITCH_SHIFTER_H_ cannam@95: #define _RUBBERBAND_PITCH_SHIFTER_H_ cannam@95: cannam@95: #include cannam@95: cannam@95: #include "base/RingBuffer.h" cannam@95: cannam@95: namespace RubberBand { cannam@95: class RubberBandStretcher; cannam@95: } cannam@95: cannam@95: class RubberBandPitchShifter cannam@95: { cannam@95: public: cannam@95: static const LADSPA_Descriptor *getDescriptor(unsigned long index); cannam@95: cannam@95: protected: cannam@95: RubberBandPitchShifter(int sampleRate, size_t channels); cannam@95: ~RubberBandPitchShifter(); cannam@95: cannam@95: enum { cannam@95: LatencyPort = 0, cannam@95: OctavesPort = 1, cannam@95: SemitonesPort = 2, cannam@95: CentsPort = 3, cannam@95: CrispnessPort = 4, cannam@95: FormantPort = 5, cannam@95: FastPort = 6, cannam@95: InputPort1 = 7, cannam@95: OutputPort1 = 8, cannam@95: PortCountMono = OutputPort1 + 1, cannam@95: InputPort2 = 9, cannam@95: OutputPort2 = 10, cannam@95: PortCountStereo = OutputPort2 + 1 cannam@95: }; cannam@95: cannam@95: static const char *const portNamesMono[PortCountMono]; cannam@95: static const LADSPA_PortDescriptor portsMono[PortCountMono]; cannam@95: static const LADSPA_PortRangeHint hintsMono[PortCountMono]; cannam@95: cannam@95: static const char *const portNamesStereo[PortCountStereo]; cannam@95: static const LADSPA_PortDescriptor portsStereo[PortCountStereo]; cannam@95: static const LADSPA_PortRangeHint hintsStereo[PortCountStereo]; cannam@95: cannam@95: static const LADSPA_Properties properties; cannam@95: cannam@95: static const LADSPA_Descriptor ladspaDescriptorMono; cannam@95: static const LADSPA_Descriptor ladspaDescriptorStereo; cannam@95: cannam@95: static LADSPA_Handle instantiate(const LADSPA_Descriptor *, unsigned long); cannam@95: static void connectPort(LADSPA_Handle, unsigned long, LADSPA_Data *); cannam@95: static void activate(LADSPA_Handle); cannam@95: static void run(LADSPA_Handle, unsigned long); cannam@95: static void deactivate(LADSPA_Handle); cannam@95: static void cleanup(LADSPA_Handle); cannam@95: cannam@95: void activateImpl(); cannam@95: void runImpl(unsigned long); cannam@95: void runImpl(unsigned long, unsigned long offset); cannam@95: void updateRatio(); cannam@95: void updateCrispness(); cannam@95: void updateFormant(); cannam@95: void updateFast(); cannam@95: cannam@95: float *m_input[2]; cannam@95: float *m_output[2]; cannam@95: float *m_latency; cannam@95: float *m_cents; cannam@95: float *m_semitones; cannam@95: float *m_octaves; cannam@95: float *m_crispness; cannam@95: float *m_formant; cannam@95: float *m_fast; cannam@95: double m_ratio; cannam@95: double m_prevRatio; cannam@95: int m_currentCrispness; cannam@95: bool m_currentFormant; cannam@95: bool m_currentFast; cannam@95: cannam@95: size_t m_blockSize; cannam@95: size_t m_reserve; cannam@95: size_t m_minfill; cannam@95: cannam@95: RubberBand::RubberBandStretcher *m_stretcher; cannam@95: RubberBand::RingBuffer *m_outputBuffer[2]; cannam@95: float *m_scratch[2]; cannam@95: cannam@95: int m_sampleRate; cannam@95: size_t m_channels; cannam@95: }; cannam@95: cannam@95: cannam@95: #endif