#include <Bounce.h>
#include <ILI9341_t3n.h>
////--------------------------------------------------------------------
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
AudioSynthWaveform waveform1;
AudioSynthNoiseWhite transientNoise;
AudioMixer4 transientMixer;
AudioEffectEnvelope transientEnvelope;
AudioAmplifier transientAmp;
AudioMixer4 mainMixer;
AudioAmplifier FinalAmp;
AudioOutputI2S i2s2;
AudioConnection patchCord1(waveform1, 0, transientMixer, 1);
AudioConnection patchCord2(transientNoise, 0, transientMixer, 0);
AudioConnection patchCord3(transientMixer, transientEnvelope);
AudioConnection patchCord4(transientEnvelope, transientAmp);
AudioConnection patchCord5(transientAmp, 0, mainMixer, 0);
AudioConnection patchCord6(mainMixer, FinalAmp);
AudioConnection patchCord7(FinalAmp, 0, i2s2, 0);
AudioConnection patchCord8(FinalAmp, 0, i2s2, 1);
AudioControlSGTL5000 sgtl5000_1;
//--------------------------------------------------
#warning AUDIO_BLOCK_SAMPLES modified by hand from 128 to 64 in Arduino\hardware\teensy\avr\cores\teensy4
#define CS_PIN 5 // Touch
#define TFT_DC 9
#define TFT_CS 10
#define TFT_RST 255 // 255 = unused, connected to 3.3V
#define TFT_MOSI 11
#define TFT_SCLK 13
#define TFT_MISO 12
#define TIRQ_PIN 4
#define BLUE_LED 34
#define TEST_PIN 22
#define ILI9341_SPI_CLOCK 60000000u
#define ILI9341_SPI_CLOCK_READ 2000000
ILI9341_t3n tft = ILI9341_t3n(TFT_CS, TFT_DC, TFT_RST);
#define LX 320
#define LY 240
#define TRUNK_LENGTH 35.0
const int bit_clock_pin = 21;
const int control_data_pin = 18;
const int din_pin = 7;
const int trig_Pin = 29;
const int manual_Pin = 30;
Bounce trigpushbutton = Bounce(trig_Pin, 10);
Bounce piezopushbutton = Bounce(manual_Pin, 10);
elapsedMillis piezo_input_timer = 0;
elapsedMillis tree_delay_timer = 0;
elapsedMillis transient_milli = 0;
boolean piezo_trigger_flag = false;
boolean piezo_sample_flag = false;
byte fill_screen_count;
boolean fill_screen_flag;
float transient_release;
float transient_attack;
float transient_noise_mix;
boolean transient_active = false;
float transient_volume_gain;
float velocity;
boolean note_active_flag;
int parametervalues[] = {0,180,0,30,5,80,50,200,1900,600,10,50,90,2000,20,80,5,0,15,95,25,100,30,0,0,1,30000,0,5,30,0,0,0,150,0,3000,0,6000,0,10000,22,11,23,23,23,23,23,23};
float trunk_length = TRUNK_LENGTH;
float branch_length;
float start_angle;
float new_clkw_branch_angle;
float new_anti_branch_angle;
const int maxSize = 256;
float x_array[maxSize] = {0};
float x_oldarray[maxSize] = {0};
float y_array[maxSize] = {0};
float y_oldarray[maxSize] = {0};
float angle_array[maxSize] = {0};
float angle_oldarray[maxSize] = {0};
float x_element;
float y_element;
float angle_element;
int count;
long int random_number;
byte max_iterations;
float random_length_multiplier;
boolean tree_animation_flag = false;
byte tree_drum_count;
boolean tree_advance_flag = false;;
boolean start_animation_flag = false;
//----------------------- ------------------------ -------------------------- -----------------------------------//
void setup() {
Serial.begin(115200);
AudioMemory(128);
sgtl5000_1.enable();
sgtl5000_1.lineOutLevel (13,0) ;
pinMode(trig_Pin, INPUT);
pinMode(manual_Pin, INPUT);
pinMode(TFT_CS, OUTPUT);
pinMode(TFT_SCLK, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(TEST_PIN, OUTPUT);
pinMode(A0, INPUT_DISABLE);
pinMode(A1, INPUT_DISABLE);
pinMode(A2, INPUT_DISABLE);
pinMode(A3, INPUT_DISABLE);
pinMode(A8, INPUT_DISABLE);
pinMode(A10, INPUT_DISABLE);
pinMode(A11, INPUT_DISABLE);
pinMode(A12, INPUT_DISABLE);
pinMode(A13, INPUT_DISABLE);
pinMode(A14, INPUT_DISABLE);
pinMode(A15, INPUT_DISABLE);
pinMode(A16, INPUT_DISABLE);
pinMode(A17, INPUT_DISABLE);
tft.begin();
tft.fillScreen(ILI9341_BLACK);
tft.setRotation(3);
transientEnvelope.decay(0.0);
transientEnvelope.sustain(1.0);
transientAmp.gain(1.25);
transientEnvelope.hold(1.0);
max_iterations = 8;
tree_drum_count = max_iterations;
}
void begin(uint32_t spi_clock = ILI9341_SPICLOCK, uint32_t spi_clock_read = ILI9341_SPICLOCK_READ);
// ----------------------------------------------------------------------------- //
void loop() {
//--------------------------------------------------------------------------------
// SCREEN WIPE / FILL CODE
//--------------------------------------------------------------------------------
if (fill_screen_flag == true && transient_milli > transient_release)
{
switch (fill_screen_count)
{
digitalWrite(BLUE_LED, 0);
case(0):
tft.fillRect(0, 0, LX, LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(1):
tft.fillRect(0, LY/10, LX, 2*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(2):
tft.fillRect(0, 2*LY/3, LX, 3*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(3):
tft.fillRect(0, 3*LY/10, LX, 4*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(4):
tft.fillRect(0, 4*LY/10, LX, 5*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(5):
tft.fillRect(0, 5*LY/10, LX, 6*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(6):
tft.fillRect(0, 6*LY/10, LX, 7*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(7):
tft.fillRect(0, 7*LY/10, LX, 8*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(8):
tft.fillRect(0, 8*LY/10, LX, 9*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(9):
tft.fillRect(0, 9*LY/10, LX, 10*LY/10, ILI9341_BLACK);
fill_screen_count++;
break;
case(10):
fill_screen_count = 0;
fill_screen_flag = false;
break;
}
}
//--------------------------------------------------------------------------------
// TRIGGER DETECTION
//--------------------------------------------------------------------------------
/*
if (piezopushbutton.update())
{
if (piezopushbutton.risingEdge())
{
piezo_trigger_flag = true;
piezo_sample_flag = false;
piezo_input_timer = 0;
}
}
if (piezo_trigger_flag == true && piezo_input_timer >= 2 && piezo_sample_flag == false) // Adding 2ms delay to reach peak piezo voltage
{
velocity = analogRead(A0) * 0.00125;
piezo_sample_flag = true;
}
if (note_active_flag == false && piezo_trigger_flag == true && piezo_sample_flag == true)
{
note_active_flag = true;
}
*/
if (trigpushbutton.update()){
if(trigpushbutton.risingEdge()){
note_active_flag = true;
velocity = 0.25;
}
}
if (note_active_flag == true)
{
digitalWrite(BLUE_LED, 1);
transient_active = true;
waveform1.begin(0.7, 180, WAVEFORM_SINE);
transientEnvelope.noteOn();
transient_milli = 0;
note_active_flag = false;
piezo_trigger_flag = false;
start_animation_flag = true;
piezo_sample_flag = false;
}
if (transient_milli > 1)
{
transientEnvelope.noteOff();
}
if (transient_milli > transient_release)
{
transient_active = false;
digitalWrite(BLUE_LED, 0);
digitalWrite(TEST_PIN, 0);
if (fill_screen_flag == false && start_animation_flag == true)
{
tree_animation_flag = true;
tree_advance_flag = true;
start_animation_flag = false;
tree_drum_count++;
if (tree_drum_count > max_iterations)
{
tree_drum_count = 0;
}
}
}
transient_volume_gain = analogRead(A12)*0.00098 - 0.1;
if (transient_volume_gain <= 0.0)
{
transient_volume_gain = 0.0;
}
transientEnvelope.attack(0.5 / velocity);
transientNoise.amplitude(0.3 * velocity);
transientMixer.gain (0 , 0.7 * (0.5 + (0.5*velocity)));
transientMixer.gain (1 , (0.3) * (0.5 + (0.5*velocity)));
transientEnvelope.release(5);
mainMixer.gain (0,transient_volume_gain);
FinalAmp.gain(2.5);
//--------------------------------------------------------------------------------
// FRACTAL TREE CODE
//--------------------------------------------------------------------------------
if (tree_animation_flag == true && note_active_flag == false && tree_advance_flag == true)
{
switch (tree_drum_count)
{
case(0):
tree_advance_flag = false;
break;
case(1):
branch_length = TRUNK_LENGTH * velocity * 0.001 * (1000 - parametervalues[1]);
tft.drawLine(LX/2, 0, LX/2, branch_length, ILI9341_WHITE);
x_oldarray[0] = LX/2;
x_oldarray[1] = LX/2;
y_oldarray[0] = branch_length;
y_oldarray[1] = branch_length;
start_angle = parametervalues[11] * 0.002;
angle_oldarray[0] = start_angle;
angle_oldarray[1] = 0 - start_angle;
tree_advance_flag = false;
break;
case(2):
for (int i = 0 ; i < 4; i++)
{
if (x_oldarray[i] != 0.0)
{
angle_element = angle_oldarray[0];
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
// ------ANTICLOCKWISE BRANCH CODE----------
angle_element = angle_oldarray[1];
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
}
}
for (int i = 0; i < 4; i++)
{
x_oldarray[i] = x_array[i];
x_array[i] = 0;
y_oldarray[i] = y_array[i];
y_array[i] = 0;
angle_oldarray[i] = angle_array[i];
angle_array[i] = 0;
}
tree_advance_flag = false;
break;
case(3):
for (int i = 0 ; i < 8; i++)
{
if (x_oldarray[i] != 0.0)
{
random_number = random(0, 50 + parametervalues[14]);
new_clkw_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] + new_clkw_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
branch_length = trunk_length * velocity * 0.001 * (1000 - parametervalues[1]);
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
// ------ANTICLOCKWISE BRANCH CODE----------
random_number = random(0, 50 + parametervalues[14]);
new_anti_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] - new_anti_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
}
}
for (int i = 0; i < 8; i++)
{
x_oldarray[i] = x_array[i];
x_array[i] = 0;
y_oldarray[i] = y_array[i];
y_array[i] = 0;
angle_oldarray[i] = angle_array[i];
angle_array[i] = 0;
}
tree_advance_flag = false;
break;
case(4):
for (int i = 0 ; i < 16; i++)
{
if (x_oldarray[i] != 0.0)
{
random_number = random(0, 50 + parametervalues[14]);
new_clkw_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] + new_clkw_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
branch_length = trunk_length * velocity * 0.001 * (1000 - parametervalues[1]);
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
// ------ANTICLOCKWISE BRANCH CODE----------
random_number = random(0, 50 + parametervalues[14]);
new_anti_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] - new_anti_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
}
}
for (int i = 0; i < 16; i++)
{
x_oldarray[i] = x_array[i];
x_array[i] = 0;
y_oldarray[i] = y_array[i];
y_array[i] = 0;
angle_oldarray[i] = angle_array[i];
angle_array[i] = 0;
}
tree_advance_flag = false;
break;
case(5):
for (int i = 0 ; i < 32; i++)
{
if (x_oldarray[i] != 0.0)
{
random_number = random(0, 50 + parametervalues[14]);
new_clkw_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] + new_clkw_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
branch_length = trunk_length * velocity * 0.001 * (1000 - parametervalues[1]);
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
// ------ANTICLOCKWISE BRANCH CODE----------
random_number = random(0, 50 + parametervalues[14]);
new_anti_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] - new_anti_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
}
}
for (int i = 0; i < 32; i++)
{
x_oldarray[i] = x_array[i];
x_array[i] = 0;
y_oldarray[i] = y_array[i];
y_array[i] = 0;
angle_oldarray[i] = angle_array[i];
angle_array[i] = 0;
}
tree_advance_flag = false;
break;
case(6):
for (int i = 0 ; i < 64; i++)
{
if (x_oldarray[i] != 0.0)
{
random_number = random(0, 50 + parametervalues[14]);
new_clkw_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] + new_clkw_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
branch_length = trunk_length * velocity * 0.001 * (1000 - parametervalues[1]);
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
// ------ANTICLOCKWISE BRANCH CODE----------
random_number = random(0, 50 + parametervalues[14]);
new_anti_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] - new_anti_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
}
}
for (int i = 0; i < 64; i++)
{
x_oldarray[i] = x_array[i];
x_array[i] = 0;
y_oldarray[i] = y_array[i];
y_array[i] = 0;
angle_oldarray[i] = angle_array[i];
angle_array[i] = 0;
}
tree_advance_flag = false;
break;
case(7):
for (int i = 0 ; i < 128; i++)
{
if (x_oldarray[i] != 0.0)
{
random_number = random(0, 50 + parametervalues[14]);
new_clkw_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] + new_clkw_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
branch_length = trunk_length * velocity * 0.001 * (1000 - parametervalues[1]);
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
// ------ANTICLOCKWISE BRANCH CODE----------
random_number = random(0, 50 + parametervalues[14]);
new_anti_branch_angle = random_number * 0.01;
angle_element = angle_oldarray[i] - new_anti_branch_angle;
for (count = 0 ; count < maxSize; count++)
{
if (angle_array[count] == 0)
{
angle_array[count] = angle_element;
count = 0;
break;
}
}
random_number = random(1 + parametervalues[12],100);
random_length_multiplier = random_number * 0.01;
branch_length *= random_length_multiplier;
y_element = y_oldarray[i] + (branch_length * cos (angle_array[i]) * random_length_multiplier);
for (count = 0 ; count < maxSize; count++)
{
if (y_array[count] == 0)
{
y_array[count] = y_element;
count = 0;
break;
}
}
x_element = x_oldarray[i] + (branch_length * sin (angle_array[i]));
for (count = 0 ; count < maxSize; count++)
{
if (x_array[count] == 0)
{
x_array[count] = x_element;
count = 0;
break;
}
}
branch_length /= random_length_multiplier;
tft.drawLine(x_oldarray[i], y_oldarray[i], x_element, y_element, ILI9341_WHITE);
}
}
for (int i = 0; i < 128; i++)
{
x_oldarray[i] = x_array[i];
x_array[i] = 0;
y_oldarray[i] = y_array[i];
y_array[i] = 0;
angle_oldarray[i] = angle_array[i];
angle_array[i] = 0;
}
tree_advance_flag = false;
break;
case(8):
for (int i = 0; i < maxSize ; i++)
{
x_oldarray[i] = 0;
x_array[i] = 0;
y_oldarray[i] = 0;
y_array[i] = 0;
angle_oldarray[i] = 0;
angle_array[i] = 0;
}
tree_advance_flag = false;
fill_screen_flag = true;
break;
}
}
}
// END OF LOOP