見出し画像

エフェクターアプリ製作日誌(2)-とりあえずエフェスト実装編

SwiftUIでDelay実装してみたけどAppleの用意したDelayだとギターように使うには厳しいレベルのノイズ?(長く引くと入力音に対してジリジリ言ってくる)

このままだとAudioUnitを自分で作るか、既存のAUを束ねるアプリにするかな〜

とりあえず参考にコード置いときます

//
//  ContentView.swift
//  iEffects
//
//  Created by 新村彰啓 on 2021/06/21.
//

import SwiftUI
import AVFoundation

struct ContentView: View {
   @State private var delayTime: Double = 1
   @State private var toneValue: Double = 5
   @State private var driveValue: Double = 5
   @State var audioPlayerNode = AVAudioPlayerNode()
   @State var audioEngine = AVAudioEngine()
   @State var speedControl = AVAudioUnitVarispeed()
   @State var pitchControl = AVAudioUnitTimePitch()
   @State var distortion = AVAudioUnitDistortion()
   @State var delay = AVAudioUnitDelay()
   let bufferDuration: TimeInterval = 0.008

   
   var body: some View {
       ZStack {
           VStack {
               HStack {
                   Button("Start") {
                       try! AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default)
                       //try! AVAudioSession.sharedInstance().setPreferredIOBufferDuration(bufferDuration)
                       try! AVAudioSession.sharedInstance().setActive(true)
                       let formatZ = audioEngine.inputNode.inputFormat(forBus: 0)
                       //audioPlayerNode = AVAudioPlayerNode()
                       //audioEngine.attach(audioPlayerNode)
                       
                       self.distortion.preGain = 10.0
                       self.distortion.loadFactoryPreset(.multiDistortedFunk)
                       self.distortion.wetDryMix = 0
                       delay.delayTime = self.delayTime
                       delay.wetDryMix = 45
                       
                       audioEngine.attach(distortion)
                       audioEngine.attach(delay)
                       
                       audioEngine.connect(audioEngine.inputNode, to: distortion, format: formatZ)
                       audioEngine.connect(distortion, to: delay, format: formatZ)
                       audioEngine.connect(delay, to: audioEngine.outputNode, format: formatZ)
                       try? audioEngine.start()
                       //audioPlayerNode.play()
                   }.padding()
                              
                           }
               
               Text(" delayTime : \(delayTime)").font(.largeTitle)
               
               Slider(value: Binding(
                   get: {
                       self.delayTime
                   },
                   set: { newValue in
                       self.delayTime = newValue
                       delay.delayTime = self.delayTime
                        
                   }
           ), in:0...2)
               
               Text("tone : \(toneValue)").font(.largeTitle)
               
               Slider(value: $toneValue, in:0...10)
               
               Text("drive : \(driveValue)").font(.largeTitle)
               
               Slider(value: $driveValue, in: -80...20)
           }
       }
       
       
   }
}

struct ContentView_Previews: PreviewProvider {
   static var previews: some View {
       ContentView()
   }
}

よろしければ、サポートお願いいたします! エフェクターアプリ製作に必要な時間や、書籍などに当てさせていただこうと思います。