C부터 B까지 연주할 수 있는 실로폰 앱을 만들어보자.
실로폰을 연주해야 하므로 해당 건반을 누르면 소리가 나도록 해야한다. 이를 위해 AVFoundation
을 사용한다.
import UIKit
// UIKit 프레임워크를 사용하기 위해 필요한 기본 파일들을 읽어들이는 부분
import AVFoundation
class ViewController: UIViewController {
// UIviewController 클래스를 상속받아 ViewController라는 이름의 새로운 클래스를 정의
var player:AVAudioPlayer?
override func viewDidLoad() {
// 오버라이딩(swift에서는 오버라이딩 시 override 키워드를 붙여주어야 한다. 재정의했음에도 키워드 붙이지 않거나, 재정의하지 않았는데 키워드를 추가하면 오류 발생!! -> 새로운 기능이나 추가 기능을 구현할 때만 사용하면 된다.
super.viewDidLoad()
}
@IBAction func keyPressed(_ sender: UIButton) {
playSound()
// 실로폰의 각 키를 눌렀을 때 소리를 재생한다
// 해당 코드는 기능이 필요할 때마다 찾아서 사용하면 된다
}
func playSound(){ // playSoud 함수 구현
guard let url = Bundle.main.url(forResource: "C", withExtension: "wav") // C 소리를 찾는다
else { return }
do{
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
// setCategory : sets the current audio session category
// playback : not a background music. main sound
// silent mode 에서도 소리가 나게 하고싶다
try AVAudioSession.sharedInstance().setActive(true)
player = try AVAudioPlayer(contentsOf: url, fileTypeHint:
AVFileType.mp3.rawValue)
guard let player = player else { return }
player.play() // 실제로 연주한다
} catch let error {
print(error.localizedDescription)
}
}
storyboard에서 키를 누르면 소리를 재생하는 함수를 실행하도록 연결해준다.
성공적으로 연결이 되면 연결 이후 해당 라인넘버에 마우스를 올려두었을 때 다음과 같이 표기된다.
현재는 같은 함수에 연결했기 때문에 모든 버튼을 눌렀을 경우 항상 C음 소리가 난다.
이제 각 버튼에서 다른 음이 나도록 해보자.
Q. 버튼을 눌렀을 때 각 키의 이름을 출력하려면 어떻게 해야 할까?
@IBAction func keyPressed(_ sender: UIButton) {
print(sender.currentTitle)
playSound()
}
sender.~
를 통해 접근할 수 있다. @IBAction func keyPressed(_ sender: UIButton) {
playSound(soundName: sender.currentTitle!)
// ! : 모든 키가 title을 가지고 있다고 이미 확인했다!
// 키를 누르게 되면 그 키에 해당하는 title 찾는다.
}
func playSound(soundName: String){
guard let url = Bundle.main.url(forResource: soundName, withExtension: "wav")
// currentTitle의 soundName에 해당하는 소리를 찾아 연주한다
https://drive.google.com/file/d/19xAdI6suS-Dgd5Xgsrs3BH1bijOWYQoI/view?usp=sharing
@IBAction func keyPressed(_ sender: UIButton) {
playSound(soundName: sender.currentTitle!)
// ! : 모든 키가 title을 가지고 있다고 이미 확인했다!
sender.alpha = 0.5
// 누르는 버튼의 투명도를 감소시킨다.
// 누른 이 후 0.2초동안 유지한다
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2){
sender.alpha = 1.0
// 0.2초가 지나면 투명도를 원래대로!
}