---
# System prepended metadata

title: 開發紀錄 week3
tags: [數位音樂訊號分析]

---

# 開發紀錄 week3
###### tags: `數位音樂訊號分析`

### HW 1 
---
#### 1. sine wave

<img width="500" height="300" src="https://i.imgur.com/Sw18Zkq.png"/>

```cpp=
//sine wave
float value = std::sin(currentAngle) * level * tailOff;

outputBuffer.addSample(0, i, value);
outputBuffer.addSample(1, i, value);
```
---
#### 2. 將sine wave改成square wave

<img width="500" height="300" src="https://i.imgur.com/1XiuUCQ.png"/>

<br>
<br>

* Think 1: 利用current angle θ  
    (1) 0+2πf < θ < π+2πf , 給value = 1  
    (2) π+2πf < θ < 2π+2πf , 給value = -1  
* Think 2: 利用sin(θ)  
    (1) 0+2πf < θ < π+2πf , 此時sin(θ) > 0 , 給value = 1  
    (2) π+2πf < θ < 2π+2πf , 此時sin(θ) < 0 , 給value = -1  

```cpp=
//square wave
float value = (std::sin(currentAngle) >= 0 ? 1 : -1) ;
value = value * level * tailOff;

outputBuffer.addSample(0, i, value);
outputBuffer.addSample(1, i, value);
```
---
#### 3. 將sine wave改成triangle wave

<img width="500" height="300" src="https://i.imgur.com/3G4jLF2.png"/>

<br>
<br>

* Think: 利用斜率  
  (1) 角度從0+2πf到π/2+2πf時， 斜率m = 2/π  
  (2) 角度從π/2+2πf到π+2πf時， 斜率m = -2/π  
  (3) 角度從π+2πf到3π/2+2πf時， 斜率m = -2/π  
  (4) 角度從3π/2+2πf到2π+2πf時， 斜率m = 2/π  

```cpp=
if (currentAngle > juce::MathConstants<float>::twoPi)
{
	currentAngle = currentAngle - juce::MathConstants<float>::twoPi;
}
if (currentAngle < 1 / 2 * juce::MathConstants<float>::pi)
{
	float value = 2 / juce::MathConstants<float>::pi * currentAngle * level * tailOff;
	outputBuffer.addSample(0, i, value);
	outputBuffer.addSample(1, i, value);
}
else if (1 / 2 * juce::MathConstants<float>::pi < currentAngle < 3 / 2 * juce::MathConstants<float>::pi) {
	float value = (-2 / juce::MathConstants<float>::pi * currentAngle + 2) * level * tailOff;
	outputBuffer.addSample(0, i, value);
	outputBuffer.addSample(1, i, value);
}
else if (currentAngle > 3 / 2 * juce::MathConstants<float>::pi) 
{
	float value = (2 / juce::MathConstants<float>::pi * currentAngle - 4) * level * tailOff;
	outputBuffer.addSample(0, i, value);
	outputBuffer.addSample(1, i, value);
}
```
---
#### 4. 將sine wave改成sawtooth wave

<img width="500" height="300" src="https://i.imgur.com/bPovjrV.png"/>

<br>
<br>

* Think: 利用斜率   
  角度從(-π)+2πf到π+2πf時，斜率m = 1/π   

```cpp=
//sawtooth wave
if (currentAngle > juce::MathConstants<float>::twoPi)
{
	currentAngle = currentAngle - juce::MathConstants<float>::twoPi;
}
float value = (1 / juce::MathConstants<float>::pi * currentAngle - 1) * level * tailOff;

outputBuffer.addSample(0, i, value);
outputBuffer.addSample(1, i, value);
```
<br>

### Note
---
#### Setting Project
<img width="500" height="300" src="https://i.imgur.com/sqaczsA.jpg"/>

---
#### SynthVoice.h
* 繼承 juce::SynthesiserVoice implement 以下函式
```cpp=
public:
	bool canPlaySound(juce::SynthesiserSound* sound) override;

	void startNote(int midiNoteNumber, float velocity, juce::SynthesiserSound* sound, int currentPitchWheelPosition) override;

	void stopNote(float velocity, bool allowTailOff) override;

	void pitchWheelMoved(int newPitchWheelValue) override;

	void controllerMoved(int controllerNumber, int newControllerValue) override;

	void renderNextBlock(juce::AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override;

	void setLevel(float newLevel);
    
private:
	float level;
	float frequency;
	int noteMidiNumber;
	float currentAngle;
	float angleIncrement;
	float tailOff;
```
* level: 決定音量大小
* frequency: 決定音高
* currentAngle: 目前sine wave相位
* angleIncrement: 增加多少相位
* tailOff: note off後音量大小
* noteMidiNumber: check [here](https://newt.phys.unsw.edu.au/jw/notes.html)

---
#### Plug-in
* 導入NewProject

<img width="360" height="300" src="https://i.imgur.com/zB4LEG3.jpg"/> <img width="360" height="300" src="https://i.imgur.com/ibzEPkR.jpg"/>

* JUCE視窗  

<img width="360" height="300" src="https://i.imgur.com/sq8i8ny.jpg"/>











    
