Hope this solution is clear.
C Major - is c,d,e,f,g,a,b,c'
F Major - is f,g,a,bb,c',d',e',f'
' - means new octave
bb - b flat
C Major - is c,d,e,f,g,a,b,c'
F Major - is f,g,a,bb,c',d',e',f'
' - means new octave
bb - b flat
Code Block language enum CMajor: Double, CaseIterable { case c = 261.63 case d = 293.66 case e = 329.63 case f = 349.23 case g = 392.00 case a = 440.00 case b = 493.88 var fMajorFrequency: Double { switch self { case .b: return 466.16 default: return self.rawValue * 2 } } static var fMajorFrequencies: [Double] { [CMajor.f.rawValue, CMajor.g.rawValue, CMajor.a.rawValue, CMajor.b.fMajorFrequency, CMajor.c.fMajorFrequency, CMajor.d.fMajorFrequency, CMajor.e.fMajorFrequency, CMajor.f.fMajorFrequency ] } } func performance(owner: Assessable) { let toneOutput = ToneOutput() var cMajorFrequencies = CMajor.allCases.map{$0.rawValue} cMajorFrequencies.append(CMajor.c.rawValue*2) let cTones = cMajorFrequencies.map( { Tone(pitch: $0, volume: 0.3) }) let fTones = CMajor.fMajorFrequencies.map( { Tone(pitch: $0, volume: 0.3) }) var toneIndex = 0 let tones = fTones Timer.scheduledTimer(withTimeInterval: 0.4, repeats: true) { timer in guard toneIndex < tones.count else { toneOutput.stopTones() timer.invalidate() owner.endPerformance() return } toneOutput.play(tone: tones[toneIndex]) toneIndex += 1 } owner.endPerformance() }