1
1. 연주된 음원을 저장하기 지난번 실로폰앱 에서는, 연주만 할 수 있었어요. 지금부터는 녹음도하고 재생도 할 수 있는 기능을 추가하기 로 해요. ‘Recursion’이라는 중요한 program기법도 배울 거에요. 연주한 음악을 재생한다는 의미는, 연주할 때의 각 건반을 그 때마다 저장한 후, 재생할 때는 그 저장된 음원을 순서대로 들려주는 것이에요. 그래서, 우선 저장 공간을 확보해야 해요. ‘initialize global name to’블록과 ‘make a list’ 블록을 끌고 오세요.
2
‘name’이라는 변수를 ‘note’로 수정하세요. List는 저장공간을 확보할 때 사용되며, 물리적으로는 스마 트폰 memory안에 앞으로 연주될 각 건반의 음원이 저장되요.
앞에서 확보된 저장공간에 연주된 음원들이 저장 되게 하기 위해서, ‘PlayNote’ subroutine안으로 ‘add items to list’블록을 가져 오세요.
3
‘list’와 ‘item’ socket에는 각각 ‘get global note’와 ‘Sound1.Source’블록이 연결되도록 하세요. 이제까 지는, 건반을 두드릴 때마다 실로폰 소리가 나고, 음원 들이 ‘note’ list에 저장되는 program을 했어요. 다음은, 스마트폰의 ‘Play’버튼을 touch했을 때, 건반 을 두드려 저장한 음원들이 순서대로 재생하는 program을 하기로 해요. ‘Play’버튼의 component 이름 이 ‘Blue_Button’인 것을 기억하세요.
4
2. ‘Recursion’을 이용하여 연주된 음원을 재생 재생되는 음원들의 순서를 가리키는 변수이름을 ‘count’라고 하고, 첫 번째 음원을 가리키면서 시작 해요.
Subroutine body의 처음에는, ‘set Sound1. Source to’블록의 socket에 ‘select list item’블록 을 연결했어요. 그런 다음, 연주된 음악의 첫 번째 건 반의 소리를 재생하도록 해요. ‘count’값을 증가시키면서 ‘note’의 저장공간의 끝 까지 재생하기 위한 조건을 만들기로 해요.
우선 ‘Control’ component중에서 ‘if then’를 선택 했어요.
5
지난번 실로폰앱 에서는, 연주만 할 수 있었어요. 지금부터는 녹음도하고 재생도할 수 있는 기능을 추가하기로 해요.
①
②
③
④
‘count’값을 ‘note’ list의 끝에 갈 때까지 ‘count’값을 1만큼 증가시키도록 해요. 이러한 음원 재생 program 은, 스마트폰의 ‘Play’버튼이 touch되면 시작되는 subroutine이에요.
6
그래서, ‘to procedure do’블록을 가져와서 ‘mutator’를 이용하여 이 subroutine의 이름을 ‘PlaybackNote’로 해요. ‘note’ list의 마지막 음원까지 재생 시키기 위해서, 이 subroutine은 계속해서 스스로를 불러와야 해요. 이 러한 방법을 ‘recursion’이라고 해요. 마치 거울이 자신의 앞뒤로 있을 때의 경우와 비슷해 요.
‘Play’버튼 touch에 대한 program도 해요. 일단 연 주를 해야만 재생을 할 수 있도록 해요. ‘note’ list에는 최소한 하나 이상의 음원이 있어야겠지요. 그런 다음, ‘PlaybackNote’를 부르면 ‘note’ list에 저장되어 있는 음원들이 재생이 될 수 있어요.
7
3. 문제해결을 위한 절차: Debugging Emulator를 통해, 앱을 동작시켜 보세요. 황당한 결과를 확인할 수 있어요. 첫 번째는, 건반과 건반 사이의 재 생시간이 너무 짧아 우아한 연주를 그대로 재생할 수가 없어요. 두 번째는, 여러 개의 연주를 했는데도, 꼭 마지 막 것만 재생을 해요. 그래서 우선, 두 번째 문제를 해결하기로 해요. 이제까지 program한 내용을 살펴보면, ‘note’ list에는 계속 새로운 연주가 쌓이게 되요. ‘count’값은 항상, 마지막 연주의 첫 번째 건반의 음원이 있는 곳을 가리키고 있어요. 만약, 모든 연주를 처음부터 듣고 싶다면, ‘Play’버튼에 program에서 ‘count’값을 다시 1로 setting하면 되요. 마지막 연주만 재생하고 싶으면, 먼저 ‘Reset’버튼을 누르고, 그런 다음 새로운 연주를 하고, 끝으로 ‘Play’버튼을 touch하면 되요. 그래서 ‘Reset’버튼 program속에 앞에서 사용한 ‘note’ list를 다시 setting했어요. ‘make a list’블록의 socket에 argument 가 붙어 있지 않아서, 이 list는 비게 되요. 즉, 기존의 음원이 모두 사라졌어요. 이런 의 미를 잘 알고 있다면, 필요할 때만 Reset을 사용하겠죠. 앞에서 말한 첫 번째 황당한 경우를 해결 하기 위해서, ‘Clock’ component를 이용 해요. 매번 건반이 눌러질 때마다 그 시각 을 list에 저장해서, 다음 음원까지의 시각 Interval 동안 충분히 재생할 수 있는 시간을 확보하도록 해요.
8
4. ‘Time’ event로 앱 완성하기 ‘time’이라는 이름의 저장 공간을 만들어요. ‘Clock1.Now’라는 method는, 현재 시각의 정보를 instant라는 format으로 제공해요.
9
건반이 눌러질 때마다, ‘time’ list에는 그 때의 시 각을 저장하도록 해요. ‘Reset’버튼이 touch되면, ‘time’ list도 비워지도록 하세요. 즉, 각 시각에 대한 기록들이 모두 사라지게 되요. ‘When Blue_Button click do’와 같은 것을 ‘Event handler’라고 해요. ‘Play’ 버튼이 눌러지면 일단 ‘PlaybackNote’ subroutine이 실행돼요.
10
그 다음부터 ‘PlaybackNote’는 Click1.Timer‘ event를 이용, ‘When Click1.Timer do’라는 Event handler와 call을 주거니 받거니 하는 암시적 인 ‘Recursion’상황이 되요. ‘Timer’ event는, ‘Click1.TimerEnabled’의 argument인 ‘true’와 ‘false’로 enable과 disable 을 할 수 있어요.
Emulator나 스마트폰으로 확인해 보세요. ‘Runtime Error’ message는 무시해도 되요. 아직 음원 사이의 Interval이 실제 연주와 상관없이 일정하다는 것을 확인할 수 있어요.
이 문제를 해결하기 위해 음원간의 interval 시간을 setting하면, 연주한 그대로를 재생할 수 있어요. 단점도 있어요. 연주와 연주 사이에, ‘Play’버튼을 눌렀다면 그 시간만큼, 다음 번 재생 때는 아무런 소 리를 들을 수 없어요.
11