#pragma once #include using namespace std; class Patch; class PatchNode; class Inlet; class Outlet; //class DelayLine; // class PatchNode { public: virtual void receive_sample(double sample, Inlet* inlet) = 0; }; class Patch : public PatchNode { public: Patch(); ~Patch(); double sendSample(double sample); virtual void receive_sample(double sample, Inlet* inlet); Outlet* _start; Inlet* _end; private: double _result; }; class Inlet { public: Inlet(PatchNode* node); void receive(double sample); private: PatchNode* _node; }; class Outlet { public: void send(double sample); void connect_to(Inlet* inlet); private: vector _inlets; }; class DelayLine : public PatchNode { public: DelayLine(int nSamp); ~DelayLine(); virtual void receive_sample(double sample, Inlet* inlet); void noise_fill(); Inlet* _inlet; Outlet* _outlet; private: double readSample(); double writeSample(double samp); int _p; // pointer to read/write int _buffer_length; double* _sample_buffer; }; class Mult : public PatchNode { public: Mult(); Mult(double factor); virtual void receive_sample(double sample, Inlet* inlet); Inlet* _inlet; Inlet* _passive_inlet; Outlet* _outlet; private: double _factor; }; class Add : public PatchNode { public: Add(); Add(double to_add); virtual void receive_sample(double sample, Inlet* inlet); Inlet* _inlet; Inlet* _passive_inlet; Outlet* _outlet; private: double _to_add; }; class OneZero : public PatchNode { public: OneZero(); virtual void receive_sample(double sample, Inlet* inlet); Inlet* _inlet; Outlet* _outlet; private: double _prev; }; class Karplus : public PatchNode { public: Karplus(double freq); virtual void receive_sample(double sample, Inlet* inlet); void pluck(); Inlet* _inlet; Outlet* _outlet; private: DelayLine* _dl; }; class KarplusPatch : public Patch { public: KarplusPatch(double freq); void pluck(); private: Karplus* _karplus; };