Table of Contents
以前紹介した音声処理のフレームワークである AudioKit を使った、簡単な鍵盤アプリの作成例を紹介します。
アプリの完成画面
白鍵鍵盤8つ(1オクターブ分)のサイン波や三角波などを鳴らすことのできる簡単なキーボードです。
音を鳴らすと、音声の波形が画面上部に表示されます。
アプリのソースコード
AudioKit のサンプルアプリである「HelloWorld」をベースにしています。
このサンプルは、ランダムに生成した周波数の音を鳴らすものでした。
これを変更し、ボタン(鍵盤)によって一定の周波数の音を鳴らすようにします。
また、Storyboardで作成されていたボタンや波形表示ビューは削除して、プログラム側(ViewController.swift)でこれらを再構成しています。
全ソースコードは以下の通りです。
ViewController.swift
import UIKit import AudioKit class ViewController: UIViewController { var oscillator: AKOscillator! // 音の周波数 let frequencies:[Double] = [ 523.23, 587.34, 659.25, 698.45, 783.98, 879.99, 987.75, 1046.5 ] // 波形の種類 let waveType = [ AKTable(.sine), AKTable(.sawtooth), AKTable(.square), AKTable(.triangle) ] override func viewDidLoad() { super.viewDidLoad() // 波形の種類を設定 oscillator = AKOscillator(waveform: waveType[0]) AudioKit.output = oscillator AudioKit.start() self.createWaveViewer() self.createKeyboard() } func createWaveViewer() { // 鳴っている音の波形ビューを作成 let waveformPlot = AKNodeOutputPlot(oscillator, frame: CGRect( x: 0, y: 0, width: self.view.frame.width, height: 100) ) waveformPlot.plotType = .buffer self.view.addSubview(waveformPlot) } func createKeyboard() { // 鍵盤の作成 let maxKeyLength = frequencies.count let keyWidth:CGFloat = 50 for i in 0 ..< maxKeyLength { let button = UIButton(frame: CGRect( x: CGFloat(i) * keyWidth, y: self.view.frame.height - 200, width: keyWidth, height: 200) ) button.backgroundColor = UIColor(white: 1, alpha: 1) button.layer.borderWidth = 1 button.layer.borderColor = UIColor.black.cgColor button.layer.cornerRadius = 4 button.setTitle("\(i)", for: .normal) button.setTitleColor(UIColor.blue, for: .normal) button.addTarget(self, action: #selector(self.toggleSound), for: .touchDown) button.addTarget(self, action: #selector(self.toggleSound), for: .touchUpInside) button.tag = i self.view.addSubview(button) } } func toggleSound(_ sender: UIButton) { if oscillator.isPlaying { oscillator.stop() } else { oscillator.amplitude = 1 oscillator.frequency = frequencies[sender.tag] oscillator.start() } } }
サンプルの解説
オシレータ AKOscillator のインスタンス作成時の引数に、波形のデータを表す AKTable を渡すことで、サイン波や三角波、四角波などを発信できます。
鍵盤ボタンを押した時と離した時に、メソッド toggleSound が呼ばれます。
ボタンに設定したタグの番号によって、鳴らす音の周波数を切り替えています。
オシレータでなっている音の波形を表示するには AKNodeOutputPlot を使用します。これのプロパティである plotType を変更することで、表示される波形の種類を変更することができます。
AudioKit を利用した複雑なプログラムについても、いずれ紹介していければと思います。