Creating long notes and short notes.

This is part of the code I am working with currently. I was wondering how you could change particular notes to be longer or shorter without changing any similar notes. I am not fully aware of how this works, I just now that it works off of a library and can play several cool songs.
The goal here is to be able to put in long notes and short notes in a specific formation to do morse code before the song.

#include <Tone.h>
Tone tone1;
#define OCTAVE_OFFSET 0

 const int ledPin = 13;      // led connected to digital pin 13
 const int knockSensor = 0;  // the piezo is connected to analog pin 0
 const int threshold = 10;  // threshold value to decide when the detected sound is a knock or not

 // these variables will change:
 int sensorReading = 0;      // variable to store the value read from the sensor pin
 int ledState = LOW;         // variable used to store the last LED status, to toggle the light
 
const int wpm = 5;
int ditLen = 0; // ms
int dashLen = 0;
int symLen = 0;
int spaceLen = 0;

int statusLed = 13;
char textDemo[] = "OK"; 
int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};

char *song = "MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d";
#define isdigit(n) (n >= '0' && n <= '9')

void play_rtttl(char *p)
{
  // Absolutely no error checking in here

  byte default_dur = 4;
  byte default_oct = 6;
  int bpm = 63;
  int num;
  long wholenote;
  long duration;
  byte note;
  byte scale;

  // format: d=N,o=N,b=NNN:
  // find the start (skip name, etc)

  while(*p != ':') p++;    // ignore name
  p++;                     // skip ':'

  // get default duration
  if(*p == 'd')
  {
    p++; p++;              // skip "d="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    if(num > 0) default_dur = num;
    p++;                   // skip comma
  }

  Serial.print("ddur: "); Serial.println(default_dur, 10);

  // get default octave
  if(*p == 'o')
  {
    p++; p++;              // skip "o="
    num = *p++ - '0';
    if(num >= 3 && num <=7) default_oct = num;
    p++;                   // skip comma
  }

  Serial.print("doct: "); Serial.println(default_oct, 10);

  // get BPM
  if(*p == 'b')
  {
    p++; p++;              // skip "b="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    bpm = num;
    p++;                   // skip colon
  }

  Serial.print("bpm: "); Serial.println(bpm, 10);

  // BPM usually expresses the number of quarter notes per minute
  wholenote = (60 * 1000L / bpm) * 4;  // this is the time for whole note (in milliseconds)

  Serial.print("wn: "); Serial.println(wholenote, 10);


  // now begin note loop
  while(*p)
  {
    // first, get note duration, if available
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    
    if(num) duration = wholenote / num;
    else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after

    // now get the note
    note = 0;

    switch(*p)
    {
      case 'c':
        note = 1;
        break;
      case 'd':
        note = 3;
        break;
      case 'e':
        note = 5;
        break;
      case 'f':
        note = 6;
        break;
      case 'g':
        note = 8;
        break;
      case 'a':
        note = 10;
        break;
      case 'b':
        note = 12;
        break;
      case 'p':
      default:
        note = 0;
    }
    p++;

    // now, get optional '#' sharp
    if(*p == '#')
    {
      note++;
      p++;
    }

    // now, get optional '.' dotted note
    if(*p == '.')
    {
      duration += duration/2;
      p++;
    }
  
    // now, get scale
    if(isdigit(*p))
    {
      scale = *p - '0';
      p++;
    }
    else
    {
      scale = default_oct;
    }

    scale += OCTAVE_OFFSET;

    if(*p == ',')
      p++;       // skip comma for next note (or we may be at the end)

    // now play the note

    if(note)
    {
      Serial.print("Playing: ");
      Serial.print(scale, 10); Serial.print(' ');
      Serial.print(note, 10); Serial.print(" (");
      Serial.print(notes[(scale - 4) * 12 + note], 10);
      Serial.print(") ");
      Serial.println(duration, 10);
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }
    else
    {
      Serial.print("Pausing: ");
      Serial.println(duration, 10);
      delay(duration);
    }
  }
}
  void setup() {
   ditLen = 1200 / wpm;
   dashLen = ditLen * 3;
   symLen = ditLen;
   spaceLen = dashLen;

   pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
   Serial.begin(9600);       // use the serial port
   Serial.print("ditlen ");
    Serial.println(ditLen);
    tone1.begin(9);
 }

 void loop() {
   // read the sensor and store it in the variable sensorReading:
   sensorReading = analogRead(knockSensor);    

   // if the sensor reading is greater than the threshold:
   if (sensorReading >= threshold) {
     // toggle the status of the ledPin:
     ledState = !ledState;   
     // update the LED pin itself:        
     digitalWrite(ledPin, ledState);
     // send the string "Knock!" back to the computer, followed by newline
     Serial.println("Knock!"); 
    blinkLed(statusLed, 1000);
      int len = strlen(textDemo);
    for (int i = 0; i < len; i++) {
      DoLetter(textDemo[i]);
    
   }

 play_rtttl(song);
  Serial.println("Done.");
  while(1);
}

   

   delay(100);  // delay to avoid overloading the serial port buffer
 }

here is the part of the code that didn’t fit, I don’t think it will make a difference but I figured I might as well post it anyways

  void DoLetter(char c) {
    switch(c) {
      case 'a':
      case 'A':
          DoDit();
          DoSym();
          DoDash();
          DoSpace();
          break;
      case 'b':
      case 'B':
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();

          DoSpace();
          break;
      case 'c':
      case 'C':
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();

          DoSpace();
          break;
      case 'd':
      case 'D':
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();

          DoSpace();
          break;
      case 'e':
      case 'E':
          DoDit();
          DoSym();

          DoSpace();
          break;
      case 'f':
      case 'F':
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoSpace();
          break;
      case 'g':
      case 'G':
          DoDash();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoSpace();
          break;
      case 'h':
      case 'H':
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();

          DoSpace();
          break;
      case 'i':
      case 'I':
          DoDit();
          DoSym();
          DoDit();
          DoSym();

          DoSpace();
          break;
      case 'j':
      case 'J':
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDash();
          DoSym();
          DoDash();
          DoSym();
          DoSpace();
          break;
      case 'k':
      case 'K':
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();      
          DoSpace();
          break;
      case 'l':
      case 'L':
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();
      
          DoSpace();
          break;
      case 'm':
      case 'M':
          DoDash();
          DoSym();
          DoDash();
          DoSym();

          DoSpace();
          break;
      case 'n':
      case 'N':
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoSpace();
          break;
      case 'o':
      case 'O':
          DoDash();
          DoSym();
          DoDash();
          DoSym();
          DoDash();
          DoSym();
      
          DoSpace();
          break;
      case 'p':
      case 'P':
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoSpace();
          break;
      case 'q':
      case 'Q':
          DoDash();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();      
          DoSpace();
          break;
      case 'r':
      case 'R':
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();
      
          DoSpace();
          break;
      case 's':
      case 'S':
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoSpace();
          break;
      case 't':
      case 'T':
          DoDash();
          DoSym();
      
          DoSpace();
          break;
      case 'u':
      case 'U':
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoSpace();
          break;
      case 'v':
      case 'V':
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();      
          DoSpace();
          break;
      case 'w':
      case 'W':
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDash();
          DoSym();      
          DoSpace();
          break;
      case 'x':
      case 'X':
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();      
          DoSpace();
          break;
      case 'y':
      case 'Y':
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDash();
          DoSym();
          DoDash();
          DoSym();      
          DoSpace();
          break;
      case 'z':
      case 'Z':
          DoDash();
          DoSym();
          DoDash();
          DoSym();
          DoDit();
          DoSym();
          DoDit();
          DoSym();      
          DoSpace();
          break;
default:
          Serial.print("unknown character >");
          Serial.print(c);
          Serial.println("<");
    }
}

void DoDit() 
{
    digitalWrite(ledPin, HIGH);
    delay(ditLen);
    digitalWrite(ledPin, LOW);
}

void DoDash() 
{
    digitalWrite(ledPin, HIGH);
    delay(dashLen);
    digitalWrite(ledPin, LOW);
}

void DoSpace() 
{
    delay(spaceLen);
}

void DoSym() 
{
    delay(symLen);
}

void blinkLed(int pin, int ms) {
    digitalWrite(pin,LOW); // turn it off it was on
    digitalWrite(pin,HIGH);
    delay(ms);
    digitalWrite(pin,LOW);
    delay(ms);
    delay(100);  // delay to avoid overloading the serial port buffer
 
}