본문 바로가기

프로그램/앱인벤터

[문제풀이]앱인벤터2 - "09. 실로폰" 확장하기 P184

앱인벤터2 문제풀이 -  P184 페이지 "실로폰" 확장하기



1. 재생 중에 사용자가 [지우기]버튼을 누르면 어떤 일이 벌어질까? 프로그램 오류가 발생하면서 앱이 멈추어 버릴 것이다. 이를 실행해 보고, 왜 그러는지 곰곰히 생각해 보자. 이 문제를 해결하기 위해서는 음악이 재생되기 시작하면 [지우기] 버튼불능으로 설정하는 방법이 있다. PlayButton.Click의 적절한 곳에 [지우기] 버튼을 불능으로 만드는 블록을 추가해 보자 그렇다면 어디에서 [지우기] 버튼을 다시 살려야 할까?


  연주를 눌러서 연주가 실행되는 동안 지우기 버튼의 기능을 비활성화 상태에 있도록하고, 연주가 끝남과 동시에 지우기버튼이 활성화되도록 해봤다.


  블록탭에서 when PlayButton1.Click do if then then에 set ResetButton1.Enabled to false를 추가한다. 그러면 연주가 되는 동안에는 계속하여 지우기버튼이 비활성화 된 것을 볼 수 있다. 

 또 다시 to PlaybackNote do 프로시저블록의 기존에 있던 if thenelse if버튼을 추가하고, else if에 get global count1 = length of list list get global notes1 으로 설정하여 카운터와 카운터에 기록된 음이 같은 값이 될 때, then에 set ResetButton1.Enabled to true를 삽입하여 연주가 끝남(녹음된음악 끝)과 동시에 지우기 버튼이 활성화되도록 설정할 수 있다. 




2. [연주] 버튼도 비슷하다. 재생 중에 사용자가 [연주] 버튼을 클릭하면 무슨 일이 벌어질지 생각해 본다. 적절한 곳에서 [연주] 버튼을 불능으로 만들고, 친절하게 "연주 중입니다."라는 메시지를 보여주자. 어디에서 [연주] 버튼을 다시 살려야 할까?



  디자이너탭에서 Label을 적당한 위치에 추가하고, 이름을 Playing이라고 한다. 그리고, Text 속성을 빈칸으로 남겨둔다. 



  블록탭에서 when PlayButton1.Click do if thenthen에 set PlayButton1.Enabled to falseset Playing.Text to "연주 중입니다."를 추가하고, to PlayBackNote doif then else ifthen에 set Playing.Text to " " 와 set PlayButton1.Enabled to true 를 추가한다.






3. "엘리제를 위하여"와 같이 음악의 제목이 들어간 버튼을 추가한다. 사용자가 버튼을 누르면, 미리 만들어 놓은 음과 시간 지연을 리스트에 대입한 후 PlayBackNote 프로시저를 호출하여 재생한다. Clock1.MakeInstantFromMillis 블록은 적절한 시간 지연을 알아내는 데 도움이 된다. 


"엘리제를 위하여"란 버튼을 누르면 지정해둔 음악이 나오고, "연주"버튼을 누를 때 이전에 재생한 음악이 저장되어있기 때문에 재생되도록 작업을 해봤다.


  디자이너탭에서 버튼을 하나 추가하고 Rename - elije로, Text 속성을 "엘리제를 위하여" 로 설정 하였다.  


블록탭에서 when elije.Click do를 꺼내어 set Sound1.Source to "elije.mp3"를 끼우고, add items to list item list에 get global notes1item에 Sound1.Source를 넣어서 추가하고, add items to list itemlist에 get global times1item에 call Clock1.MakeinstantFromMillis millis "3000" 을 추가하고, 마지막으로 call Sound1.Play로 마무리한다. 





4. 사용자가 연주를 하다가 자리를 비워야 할 때, 앱을 그 상태로 둔 채 나갔다가 돌아와 연이어 연주를 하더라도 하나의 노래로 녹음이 된다. 하지만 중간에 지연된 시간까지 그대로 녹음되는 것은 사용자도 원하지 않을 것이다. 이때 프로그램을 다음과 같이 개선해 보자. (1) 중간에 일정한 시간 이상, 예를 들어 1분 이상 지연이 발생하면 녹음을 멈춘다. (2) Math 서랍에 있는 min 블록을 이용하여, Clock1.TimerInterval 값에 제한을 둔다. 


일단, 1000밀리초가 1초라서 1000밀리초*60 = 1분으로 계산하고 60000이란 값을 대입했는데, 아직 Max나 Min의 개념이 확실치 않아 다음에 다시 해야겠다. 인터넷에 찾아보면 min의 처음인자값이 높은값, 다음인자값이 낮은값(또는 입력값)을 넣는 것 같은 데, 좀더 공부해봐야 알것 같다.


그리고, 원리는 사용자에게 버튼형태의 숫자를 입력받아 실로폰음을 내는 것이기 때문에, 먼저 인자값이 숫자인지 확인하는 과정, 그 다음 TimeInterval에 1분미만 동안 값이 입력되지 않으면, Clock를 비활성화 시키고, 값이 입력되면 예외처리문이 발생하는 구조다. 


  블록탭에 (다시하기)




5. 현재 연주되고 있는 건반의 버튼 모양독특한 시각 효과를 주어 어느 건반이 연주되는지를 보여주자. 예를 들어, Text 또는 BackgroundColor, ForegroundColor 등을 잠시 바꾸어 주는 방법이 있다. 


건반을 눌렀을 때(TouchDown) 글씨가 일시적으로 커보이는 효과연회색 건반을, 누른 건반에서 손을 떼었을 때(TouchUp) 원본색 건반과 글씨로 보이게 작업을 해 보았다.


  블록탭에서 when Button1.TouchDown doset Button1.BackgroundColor to "연회색" 과 set Button1.FontSize to "17" 을 넣고, when Button1.TouchUp do에는 set Button1.BackgroundColor to "원본색" 과 set Button1.FontSize to "14"를 넣고, 나머지 버튼들도 이런 형태로 추가하여 작업을 마친다. 











<출처 :  David Wolber, Hal Abelson, Ellen Spertus, Liz Looney(2015), 

앱인벤터2(초판)(오일석, 이진선 번역, 서울:한빛아카데미. (원서는 2014년에 출판)>