Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Sitar.h
1#ifndef STK_SITAR_H
2#define STK_SITAR_H
3
4#include "Instrmnt.h"
5#include "DelayA.h"
6#include "OneZero.h"
7#include "Noise.h"
8#include "ADSR.h"
9#include <cmath>
10
11namespace stk {
12
13/***************************************************/
30/***************************************************/
31
32class Sitar : public Instrmnt
33{
34 public:
36 Sitar( StkFloat lowestFrequency = 8.0 );
37
39 ~Sitar( void );
40
42 void clear( void );
43
45 void setFrequency( StkFloat frequency );
46
48 void pluck( StkFloat amplitude );
49
51 void noteOn( StkFloat frequency, StkFloat amplitude );
52
54 void noteOff( StkFloat amplitude );
55
57 StkFloat tick( unsigned int channel = 0 );
58
60
67 StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
68
69 protected:
70
71 DelayA delayLine_;
72 OneZero loopFilter_;
73 Noise noise_;
74 ADSR envelope_;
75
76 StkFloat loopGain_;
77 StkFloat amGain_;
78 StkFloat delay_;
79 StkFloat targetDelay_;
80
81};
82
83inline StkFloat Sitar :: tick( unsigned int )
84{
85 if ( fabs(targetDelay_ - delay_) > 0.001 ) {
86 if ( targetDelay_ < delay_ )
87 delay_ *= 0.99999;
88 else
89 delay_ *= 1.00001;
90 delayLine_.setDelay( delay_ );
91 }
92
93 lastFrame_[0] = delayLine_.tick( loopFilter_.tick( delayLine_.lastOut() * loopGain_ ) +
94 (amGain_ * envelope_.tick() * noise_.tick()));
95
96 return lastFrame_[0];
97}
98
99inline StkFrames& Sitar :: tick( StkFrames& frames, unsigned int channel )
100{
101 unsigned int nChannels = lastFrame_.channels();
102#if defined(_STK_DEBUG_)
103 if ( channel > frames.channels() - nChannels ) {
104 oStream_ << "Sitar::tick(): channel and StkFrames arguments are incompatible!";
105 handleError( StkError::FUNCTION_ARGUMENT );
106 }
107#endif
108
109 StkFloat *samples = &frames[channel];
110 unsigned int j, hop = frames.channels() - nChannels;
111 if ( nChannels == 1 ) {
112 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop )
113 *samples++ = tick();
114 }
115 else {
116 for ( unsigned int i=0; i<frames.frames(); i++, samples += hop ) {
117 *samples++ = tick();
118 for ( j=1; j<nChannels; j++ )
119 *samples++ = lastFrame_[j];
120 }
121 }
122
123 return frames;
124}
125
126} // stk namespace
127
128#endif
129
STK ADSR envelope class.
Definition: ADSR.h:25
StkFloat tick(void)
Compute and return one output sample.
Definition: ADSR.h:115
STK allpass interpolating delay line class.
Definition: DelayA.h:29
void setDelay(StkFloat delay)
Set the delay-line length.
StkFloat lastOut(void) const
Return the last computed output value.
Definition: DelayA.h:80
StkFloat tick(StkFloat input)
Input one sample to the filter and return one output.
Definition: DelayA.h:137
STK instrument abstract base class.
Definition: Instrmnt.h:20
STK noise generator.
Definition: Noise.h:22
StkFloat tick(void)
Compute and return one output sample.
Definition: Noise.h:59
STK one-zero filter class.
Definition: OneZero.h:21
StkFloat tick(StkFloat input)
Input one sample to the filter and return one output.
Definition: OneZero.h:79
STK sitar string model class.
Definition: Sitar.h:33
void setFrequency(StkFloat frequency)
Set instrument parameters for a particular frequency.
void noteOn(StkFloat frequency, StkFloat amplitude)
Start a note with the given frequency and amplitude.
~Sitar(void)
Class destructor.
void clear(void)
Reset and clear all internal state.
StkFloat tick(unsigned int channel=0)
Compute and return one output sample.
Definition: Sitar.h:83
Sitar(StkFloat lowestFrequency=8.0)
Class constructor, taking the lowest desired playing frequency.
void noteOff(StkFloat amplitude)
Stop a note with the given amplitude (speed of decay).
void pluck(StkFloat amplitude)
Pluck the string with the given amplitude using the current frequency.
An STK class to handle vectorized audio data.
Definition: Stk.h:279
unsigned int channels(void) const
Return the number of channels represented by the data.
Definition: Stk.h:416
unsigned int frames(void) const
Return the number of sample frames represented by the data.
Definition: Stk.h:419
static void handleError(const char *message, StkError::Type type)
Static function for error reporting and handling using c-strings.
The STK namespace.
Definition: ADSR.h:6

The Synthesis ToolKit in C++ (STK)
©1995--2021 Perry R. Cook and Gary P. Scavone. All Rights Reserved.