File: Instrument.cpp

package info (click to toggle)
sndobj 2.6.7%2Bds1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,952 kB
  • sloc: ansic: 55,663; cpp: 21,625; python: 391; makefile: 130; java: 22; sh: 21
file content (125 lines) | stat: -rw-r--r-- 2,486 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "Instrument.h"

Instrument::Instrument()
{
  int i;

  /* input */
#ifndef MACOSX
  input = new SndRTIO(2, SND_INPUT, 1024, 4);
#else
  input = new SndCoreAudio(2);
#endif
  sound = new SndIn(input, 1);

  /* strings */
  fr[0] =  73.4f;
  dec[0] = 12.f;
  fr[1] =  130.8f;
  dec[1] = 12.f;
  fr[2] =  233.0f;
  dec[2] = 12.f;
  fr[3] =  392.0f;
  dec[3] = 12.f;
	
  strmix = new Mixer;
  for (i = 0; i < 4; i++){
    string[i] = new StringFlt(fr[i], sound, dec[i]);
    gstr[i] = 0.5f;
    value[i] = new  Unit(0.5f, UNIT_STEP);
    lp[i] = new LoPass(10.f, value[i]);
    strgain[i] = new Ring(lp[i], string[i]);
    strmix->AddObj(strgain[i]);
    StringOff(i);
  }

  /* loops */
  loop[0] = new SndLoop(.15f, .8f, sound);
  loop[1] = new SndLoop(.5f, 2.4f, sound);
  loop[2] = new SndLoop(.8f, 4.8f, sound);
  loop[3] = new SndLoop(1.2f, 9.f, sound);

  loopmix = new Mixer;
  for (i = 0; i < 4; i++){
    gloop[i] = 0.f;
    loopgain[i] = new Gain(gloop[i], loop[i]);
    loopmix->AddObj(loopgain[i]);
    LoopOff(i);
  }
  ap[0] = new Allpass(.6f, .05f, loopmix);
  ap[1] = new Allpass(.75f, .09f, ap[0]);

  /* output */
  outchannel[0] = strmix;
  outchannel[1] = ap[1];
#ifndef MACOSX
  output = new SndRTIO(2,SND_OUTPUT, 1024, 4, SHORTSAM, outchannel);
#else
  output = input;
  output->SetOutput(1, strmix);
  output->SetOutput(2, ap[1]);
#endif
  

  /* processing thread */
  thread = new SndThread();
  thread->AddObj(sound);
  for(i=0; i<4; i++){
    thread->AddObj(value[i]);
    thread->AddObj(lp[i]);
    thread->AddObj(string[i]);
    thread->AddObj(strgain[i]);
    thread->AddObj(loop[i]);
    thread->AddObj(loopgain[i]);
  }
  thread->AddObj(strmix);
  thread->AddObj(loopmix);
  thread->AddObj(ap[0]);
  thread->AddObj(ap[1]);	
  thread->AddObj(input, SNDIO_IN);
  thread->AddObj(output, SNDIO_OUT);
  process_on = false;
}

Instrument::~Instrument()
{
  ProcessOff();
  delete input;
  for(int i=0;i <4; i++){
    delete string[i];
    delete value[i];
    delete lp[i];
    delete strgain[i];
    delete loop[i];
    delete loopgain[i];
  }
  delete ap[0];
  delete ap[1];
  delete strmix;
  delete loopmix;
  delete thread;
#ifndef MACOSX
  delete output;
#endif

}

void Instrument::ProcessOn()
{
  if(!process_on){
    thread->ProcOn();
    process_on = true;
  }
}

void Instrument::ProcessOff()
{
  if(process_on){
    thread->ProcOff();
    process_on = false;
    for(int i = 0; i < 4; i++) {
      StringOff(i);
      LoopOff(i);
    }
  }
}