To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / CollidoscopeApp / include / Wave.h @ 2:dd889fff8423

History | View | Annotate | Download (4.38 KB)

1
#pragma once
2

    
3

    
4
#include "cinder/app/App.h"
5
#include "cinder/gl/gl.h"
6
#include "cinder/gl/Batch.h"
7

    
8

    
9
#include "Chunk.h"
10
#include "DrawInfo.h"
11

    
12
#ifdef USE_PARTICLES
13
#include "ParticleController.h"
14
#endif 
15

    
16
#include "cinder/Color.h"
17
#include "cinder/PolyLine.h"
18
#include "cinder/Rand.h"
19

    
20
#include <vector>
21
#include <map>
22

    
23

    
24
class DrawInfo;
25
typedef int SynthID;
26

    
27

    
28
using ci::ivec2;
29
using ci::vec2;
30
using ci::Color;
31
using ci::ColorA;
32

    
33
struct Cursor {
34
    static const int kNoPosition = -100;
35
    int pos;
36
    double lastUpdate;
37
};
38

    
39

    
40
class Wave
41
{
42
        friend class ParticleController;
43

    
44
public:
45

    
46
        class Selection {
47
                
48
        public:
49

    
50
        Selection( Wave * w, Color color );
51
        
52
        void setStart( size_t start );
53

    
54
                void setSize( size_t size );
55
                
56
        void inline setParticleSpread( float spread ){
57
            mParticleSpread = spread;
58
                }
59

    
60
                size_t getStart(void) const { return mSelectionStart; }
61
                
62
        size_t getEnd(void) const { return mSelectionEnd; }
63

    
64
                size_t inline getSize(void) const { 
65
                        if (mNull)
66
                                return 0;
67
                        else
68
                                return 1 + mSelectionEnd - mSelectionStart; 
69
                }
70

    
71
                float inline  getParticleSpread() const { return mParticleSpread; }
72

    
73
                inline void setToNull(){
74
            mParticleSpread = 1.0f;
75
                        mNull = true;
76
                }
77

    
78
                inline bool isNull() const{
79
                        return mNull;
80
                }
81

    
82
                inline const Color & getColor() const{
83
                        return mColor;
84
                }
85

    
86
    private:
87

    
88
        size_t mSelectionStart;
89
        
90
        size_t mSelectionEnd;
91
        
92
        float mParticleSpread;
93

    
94
        bool mNull = true;
95

    
96
        Color mColor;
97

    
98
        Wave * mWave;
99

    
100
        }; // class Selection
101

    
102
        
103

    
104
#ifdef USE_PARTICLES
105
        ParticleController mParticleController;
106
#endif 
107

    
108
        
109

    
110
        /* there is one cursor for each Synth being played */
111
        std::map < SynthID, Cursor > mCursors;
112
        std::vector<int> mCursorsPos;
113

    
114
public:
115
        
116
    // note used to identify the loop for cursor position 
117
    static const int kLoopNote = -1;
118
        static const cinder::Color CURSOR_CLR;
119
        /* must be in sync with supercollider durationFactor ControlSpec max */
120
        static const int MAX_DURATION = 8;
121
#ifdef USE_PARTICLES
122
        static const int PARTICLESIZE_COEFF = 40;
123
#endif
124

    
125
        void reset(bool onlyChunks);
126

    
127
        void setChunk(size_t index, float bottom, float top);
128

    
129
        const Chunk & getChunk(size_t index);
130

    
131
    inline void setCursorPos( SynthID id, int pos, const DrawInfo& di ){
132

    
133
            Cursor & cursor = mCursors[id];
134
            cursor.pos = pos;
135
            cursor.lastUpdate = ci::app::getElapsedSeconds();
136

    
137
#ifdef USE_PARTICLES
138
            /* if the duration is greater than 1.0 carry on the cursor as a particle
139
            the smaller the selection the more particles
140
            the bigger the duration the more particles */
141
            if (mSelection.getParticleSpread() > 1.0f){
142
                    /* amountCoeff ranges from 1/8 to 1 */
143
            const float amountCoeff = (mSelection.getParticleSpread() / MAX_DURATION);
144
                
145
            /* get radom point within seleciton as center of the particle */
146
            vec2 centrePoint; // was former getRandomPoint
147
            const int randomChunkIndex = ci::Rand::randInt(mSelection.getStart(), mSelection.getEnd() );
148

    
149
            centrePoint.x = di.flipX( 1 + (randomChunkIndex * (2 + Chunk::kWidth)) + Chunk::kWidth / 2 );
150
            centrePoint.y = di.flipY( di.audioToHeigt(0.0) );
151

    
152
            const float wavePixelLen = mNumChunks * ( 2 + Chunk::kWidth);
153
                    centrePoint.x *= float(di.getWindowWidth()) / wavePixelLen;
154

    
155
                    mParticleController.addParticles(
156
                std::max( 1, (int)(amountCoeff * ParticleController::kMaxParticleAdd * mFilterCoeff) ), // amount of particles to add 
157
                            centrePoint,
158
                mSelection.getParticleSpread() * PARTICLESIZE_COEFF   // size of the cloud 
159
                            );
160
            }
161
#endif
162

    
163
                
164
        }
165

    
166
    void update( double secondsPerChunk, const DrawInfo& di );
167

    
168
    void removeCursor( SynthID id ) { mCursors.erase( id ); }
169

    
170
    // parameter ranges from 0 to 1 
171
        inline void setselectionAlpha(float alpha){ mFilterCoeff = alpha;}
172

    
173
    void draw( const DrawInfo& di );
174

    
175
        Selection& getSelection() { return mSelection; };
176

    
177
        size_t getSize() const{ return mChunks.size();  }
178

    
179
        void setScopePoint(int index, float audioVal);
180

    
181
    Wave( size_t numChunks, Color selectionColor );
182

    
183
    // no copies 
184
    Wave( const Wave &copy ) = delete;
185
    Wave & operator=(const Wave &copy) = delete;
186

    
187

    
188
private:
189
    
190
    const size_t mNumChunks;
191

    
192
    std::vector<Chunk> mChunks;
193
    
194
    Selection mSelection;
195

    
196
    cinder::Color mColor;
197

    
198
    float mFilterCoeff;
199

    
200
    ci::gl::BatchRef mChunkBatch;
201

    
202
};
203