궁금했던 피아노 페달들의 기능에대해 알게되다.
건반을 누르면 해당 음의 현을 해머가 때려 소리가 나게 되고 떼면 댐퍼가 현을 잡아줘 진동을 멈추게 해 소리가 멎는 것이 기본 피아노 구조.

오른쪽 서스테인 페달을 밟으면 이 진동을 멈추게 하는 댐퍼들의 작동을 막아 소리가 길게 지속되게 한다.

왼쪽 소프트 페달은 그랜드 피아노의 경우 타현기구 전체가 약간 오른쪽으로 이동해 대응하는 3줄 또는 2줄의 현 중 한 줄은 해머의 타격을 받지않게 되어 음량이 작아지고 음색도 좀 변화한다고. 업라이트피아노의 경우 해머가 현쪽으로 움직여 현과 해머의 간격이 가까워지게 되어 소리가 부드러워지게 한다.

중간 소스테누토 페달은 특정 그랜드 피아노에서만 제대로 작동하는데 한 음이나 한 화음만(건반을 누른 뒤 손가락을 떼기전에 페달을 밟으면 눌려졌던 음들만 댐퍼의 작동을 막는 것)을 지속시키는 기능을 한다. 업라이트 피아노의 경우엔 해머와 현 사이에 천이 내려와 소리를 작게 만드는 기능을 한다고.

그외 책들을 잔뜩 읽으며 보낸 하루.

14/4/25 금

책보고 Visual C++ 6.0 API 예제 따라하기.


Win32 Application 프로젝트로 시작, 코드로 에디트 박스와 버튼을 만들고 버튼 누를 때마다 에디트 박스 속 내용 변화시키기.

소스는 기본적인 윗부분은 똑같기에 콜백함수만.

LRESULT CALLBACK WndProc(HWND hWnd,
                              UINT uMsg,
                              WPARAM wParam,
                              LPARAM lParam)
{
     static int iSw=1;
     static HWND hEdit,hButtPrint, hButtExit;

     char szText1[]="First";
     char szText2[]="마지막";

     switch(uMsg){
     case WM_CREATE:
          hEdit=CreateWindow("Edit", //에디트 박스 클래스
                             "Edit",
                             WS_CHILD|WS_VISIBLE|WS_BORDER,
                             100,
                             20,
                             90,
                             30,
                             hWnd,
                             (HMENU)3,
                             NULL,
                             NULL);
          hButtPrint=CreateWindow("BUTTON", //버튼 클래스
                             "Edit Box 내용변화", //버튼 캡션
                             WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                             //버튼 스타일
                             20, //x좌표
                             60, //y좌표
                             160, //넓이
                             30, //높이
                             hWnd,
                             (HMENU)1, //버튼의 아이디
                             NULL,
                             NULL);
          hButtExit=CreateWindow("BUTTON",
                             "종료",
                             WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
                             200,
                             60,
                             90,
                             30,
                             hWnd,
                             (HMENU)2,
                             NULL,
                             NULL);
          return false;
     case WM_COMMAND:
          switch(LOWORD(wParam)){
               //버튼의 아이디는 wParam 값에 저장되어 있다
          case 1:
               switch(iSw){
               case 1:
                    iSw=2;
                    SetWindowText(hEdit,szText1);
                    return false;
               case 2:
                    iSw=1;
                    SetWindowText(hEdit,szText2);
                    return false;
               }
               return false;
          case 2:
               PostQuitMessage(0);
          }
          return false;
     case WM_DESTROY:
          PostQuitMessage(0);
          return false;
     }
     return DefWindowProc(hWnd,uMsg,wParam,lParam);
}