| 
							- /*
 -   ZynAddSubFX - a software synthesizer
 - 
 -   PADnoteParameters.h - Parameters for PADnote (PADsynth)
 -   Copyright (C) 2002-2005 Nasca Octavian Paul
 -   Author: Nasca Octavian Paul
 - 
 -   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.
 - */
 - 
 - #ifndef PAD_NOTE_PARAMETERS_H
 - #define PAD_NOTE_PARAMETERS_H
 - 
 - #include "../globals.h"
 - 
 - #include "Presets.h"
 - #include <string>
 - #include <functional>
 - 
 - namespace zyncarla {
 - 
 - /**
 -  * Parameters for PAD synthesis
 -  *
 -  * @note unlike most other parameter objects significant portions of this
 -  * object are `owned' by the non-realtime context. The realtime context only
 -  * needs the samples generated by the PADsynth algorithm and modulators (ie
 -  * envelopes/filters/LFOs) for amplitude, frequency, and filters.
 -  * The ownership will be unclear for the time being, but it should be made more
 -  * explicit with time.
 -  */
 - class PADnoteParameters:public Presets
 - {
 -     public:
 -         PADnoteParameters(const SYNTH_T &synth_, FFTwrapper *fft_,
 -                           const AbsTime *time_ = nullptr);
 -         ~PADnoteParameters();
 - 
 -         void defaults();
 -         void add2XML(XMLwrapper& xml);
 -         void getfromXML(XMLwrapper& xml);
 - 
 -         void paste(PADnoteParameters &p);
 -         void pasteRT(PADnoteParameters &p);
 - 
 -         //returns a value between 0.0f-1.0f that represents the estimation perceived bandwidth
 -         float getprofile(float *smp, int size);
 - 
 -         //parameters
 - 
 -         //the mode: 0 - bandwidth, 1 - discrete (bandwidth=0), 2 - continous
 -         //the harmonic profile is used only on mode 0
 -         unsigned char Pmode;
 - 
 -         //Harmonic profile (the frequency distribution of a single harmonic)
 -         struct {
 -             struct { //base function
 -                 unsigned char type;
 -                 unsigned char par1;
 -             } base;
 -             unsigned char freqmult; //frequency multiplier of the distribution
 -             struct { //the modulator of the distribution
 -                 unsigned char par1;
 -                 unsigned char freq;
 -             } modulator;
 - 
 -             unsigned char width; //the width of the resulting function after the modulation
 -             struct { //the amplitude multiplier of the harmonic profile
 -                 unsigned char mode;
 -                 unsigned char type;
 -                 unsigned char par1;
 -                 unsigned char par2;
 -             } amp;
 -             bool autoscale; //if the scale of the harmonic profile is computed automaticaly
 -             unsigned char onehalf; //what part of the base function is used to make the distribution
 -         } Php;
 - 
 - 
 -         unsigned int  Pbandwidth; //the values are from 0 to 1000
 -         unsigned char Pbwscale; //how the bandwidth is increased according to the harmonic's frequency
 - 
 -         struct { //where are positioned the harmonics (on integer multimplier or different places)
 -             unsigned char type;
 -             unsigned char par1, par2, par3; //0..255
 -         } Phrpos;
 - 
 -         struct { //quality of the samples (how many samples, the length of them,etc.)
 -             unsigned char samplesize;
 -             unsigned char basenote, oct, smpoct;
 -         } Pquality;
 - 
 -         //frequency parameters
 -         //If the base frequency is fixed to 440 Hz
 -         unsigned char Pfixedfreq;
 - 
 -         /* Equal temperate (this is used only if the Pfixedfreq is enabled)
 -            If this parameter is 0, the frequency is fixed (to 440 Hz);
 -            if this parameter is 64, 1 MIDI halftone -> 1 frequency halftone */
 -         unsigned char PfixedfreqET;
 -         unsigned char PBendAdjust;
 -         unsigned char POffsetHz;
 -         unsigned short int PDetune; //fine detune
 -         unsigned short int PCoarseDetune; //coarse detune+octave
 -         unsigned char      PDetuneType; //detune type
 - 
 -         EnvelopeParams *FreqEnvelope; //Frequency Envelope
 -         LFOParams      *FreqLfo; //Frequency LFO
 - 
 -         //Amplitude parameters
 -         unsigned char PStereo;
 -         /* Panning -  0 - random
 -                   1 - left
 -                  64 - center
 -                 127 - right */
 -         unsigned char PPanning;
 - 
 -         unsigned char PVolume;
 - 
 -         unsigned char PAmpVelocityScaleFunction;
 - 
 -         EnvelopeParams *AmpEnvelope;
 - 
 -         LFOParams *AmpLfo;
 - 
 -         /* Adjustment factor for anti-pop fadein */
 -         unsigned char Fadein_adjustment;
 - 
 -         unsigned char PPunchStrength, PPunchTime, PPunchStretch,
 -                       PPunchVelocitySensing;
 - 
 -         //Filter Parameters
 -         FilterParams *GlobalFilter;
 - 
 -         // filter velocity sensing
 -         unsigned char PFilterVelocityScale;
 - 
 -         // filter velocity sensing
 -         unsigned char PFilterVelocityScaleFunction;
 - 
 -         EnvelopeParams *FilterEnvelope;
 -         LFOParams      *FilterLfo;
 - 
 - 
 - 
 - 
 -         float setPbandwidth(int Pbandwidth); //!< Return the BandWidth in cents
 -         //! Get the n-th overtone position relatively to N harmonic
 -         float getNhr(int n) const;
 - 
 -         void applyparameters(void);
 -         //! Compute the #sample array from the other parameters.
 -         //! For the function's parameters, see sampleGenerator()
 -         void applyparameters(std::function<bool()> do_abort,
 -                              unsigned max_threads = 0);
 -         void export2wav(std::string basefilename);
 - 
 -         OscilGen  *oscilgen;
 -         Resonance *resonance;
 - 
 -         struct Sample {
 -             int    size;
 -             float  basefreq;
 -             float *smp;
 -         };
 - 
 -         //! RT sample data
 -         Sample sample[PAD_MAX_SAMPLES];
 - 
 -         typedef std::function<void(int,PADnoteParameters::Sample&)> callback;
 - 
 -         //! PAD synth main function
 -         //! Generate spectrum and run IFFTs on it
 -         //! @param cb A callback that will be executed for each sample buffer
 -         //!           Note that this function can be executed by multiple
 -         //!           threads at the same time, so make sure you use mutexes
 -         //!           etc where required
 -         //! @param do_abort Function that decides whether the calculation should
 -         //!                 be aborted (probably because of interruptions by the
 -         //!                 user)
 -         //! @param max_threads Maximum number of threads for computation, or
 -         //!                    zero if no maximum shall be set
 -         int sampleGenerator(PADnoteParameters::callback cb,
 -                             std::function<bool()> do_abort,
 -                             unsigned max_threads = 0);
 - 
 -         const AbsTime *time;
 -         int64_t last_update_timestamp;
 - 
 -         static const rtosc::MergePorts ports;
 -         static const rtosc::Ports     &non_realtime_ports;
 -         static const rtosc::Ports     &realtime_ports;
 - 
 -     private:
 -         void generatespectrum_bandwidthMode(float *spectrum,
 -                                             int size,
 -                                             float basefreq,
 -                                             const float *profile,
 -                                             int profilesize,
 -                                             float bwadjust) const;
 -         void generatespectrum_otherModes(float *spectrum,
 -                                          int size,
 -                                          float basefreq) const;
 -         void deletesamples();
 -         void deletesample(int n);
 - 
 -     public:
 -         const SYNTH_T &synth;
 - };
 - 
 - }
 - 
 - #endif
 
 
  |