format PE GUI 4.0
entry start
include 'win32a.inc'

section '.code' code readable executable

  start:




   invoke  GetModuleHandle,0
   mov     [clsHInstance],eax

   invoke  LoadIcon,0,IDI_ASTERISK
   mov     [clsHIcon],eax
   invoke  LoadCursor,0,IDC_HAND
   mov     [clsHCursor],eax
   invoke  RegisterClass,clsStyle


   invoke  CreateWindowEx,0,szClassName,szTitleName,WS_VISIBLE+WS_SYSMENU+WS_MINIMIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,350,470,0,0,[clsHInstance],0
   mov     [hwindow],eax
   invoke  CreateWindowEx,0,classbox,0,WS_CHILD+WS_VISIBLE+WS_VSCROLL+CBS_DROPDOWNLIST,30,30,290,350,[hwindow],68h,[clsHInstance],0
   mov     [hlist],eax
   mov     esi,melodies
allmelo:
   invoke  SendMessage,[hlist],CB_ADDSTRING,0,esi
nextbyt:
   inc     esi
   cmp     byte [esi],0
jne nextbyt
   inc     esi
   cmp     esi,melody1
jb allmelo
   invoke  SendMessage,[hlist],CB_SETCURSEL,1,0



   cld
   mov     edi,piano00
   mov     edx,hzs
   finit
   fild    [multip]           ;10922
   fld1                       ;1                 10922
   fld1                       ;1                 1                 10922
   fadd    st0,st0            ;2                 1                 10922
   fldpi                      ;pi                2                 1             10922
   fmul    st0,st1            ;2*pi              2                 1             10922
   fild    [discr]            ;48000             2*pi              2             1          10922
   fdivp   st1,st0            ;2*pi/48000        2                 1             10922


shest:
   mov     esi,splwav
   mov     ecx,11
   repe    movsd
   mov     [scount],0
   mov     ecx,24000
zykle:
   call    scomput
   stosw
   add     [scount],22
   call    scomput
   stosw
   sub     [scount],21
loop zykle
   add     edx,4
   cmp     edx,fin
jb shest
jmp dalee


scomput:
   fild    [scount]           ;n                 2*pi/48000        2               1            10922
   fmul    st0,st1            ;2*pi*n/48000      2*pi/48000        2               1            10922
   fld     st0                ;2*pi*n/48000      2*pi*n/48000      2*pi/48000      2            1           10922
   fcos                       ;cos               2*pi*n/48000      2*pi/48000      2            1           10922
   fadd    st0,st4            ;cos+1             2*pi*n/48000      2*pi/48000      2            1           10922
   fdiv    st0,st3            ;(cos+1)/2         2*pi*n/48000      2*pi/48000      2            1           10922
   mov     eax,[edx]
   mov     [hz],eax
   fild    [hz]               ;hz                (cos+1)/2         2*pi*n/48000    2*pi/48000   2           1           10922
   fmul    st0,st2            ;2*pi*n*hz/48000   (cos+1)/2         2*pi*n/48000    2*pi/48000   2           1           10922
   fsin                       ;sin               (cos+1)/2         2*pi*n/48000    2*pi/48000   2           1           10922
   add     edx,12
   mov     eax,[edx]
   mov     [hz],eax
   fild    [hz]               ;hz                sin               (cos+1)/2       2*pi*n/48000 2*pi/48000  2           1           10922
   fmul    st0,st3            ;2*pi*n*hz/48000   sin               (cos+1)/2       2*pi*n/48000 2*pi/48000  2           1           10922
   fsin                       ;sin               sin               (cos+1)/2       2*pi*n/48000 2*pi/48000  2           1           10922
   faddp   st1,st0            ;sin+sin           (cos+1)/2         2*pi*n/48000    2*pi/48000   2           1           10922
   add     edx,16
   mov     eax,[edx]
   mov     [hz],eax
   fild    [hz]               ;hz                sin+sin           (cos+1)/2       2*pi*n/48000 2*pi/48000  2           1           10922
   fmulp   st3,st0            ;sin+sin           (cos+1)/2         2*pi*n*hz/48000 2*pi/48000   2           1           10922
   fxch    st2                ;2*pi*n*hz/48000   (cos+1)/2         sin+sin         2*pi/48000   2           1           10922
   fsin                       ;sin               (cos+1)/2         sin+sin         2*pi/48000   2           1           10922
   faddp   st2,st0            ;(cos+1)/2         sin+sin+sin       2*pi/48000      2            1           10922
   fmulp   st1,st0            ;sin*cos           2*pi/48000        2               1            10922
   fmul    st0,st4            ;sin*cos*10922     2*pi/48000        2               1            10922
   fistp   [otsch]            ;2*pi/48000        2                 1               10922
   mov     ax,[otsch]
   sub     edx,28
retn

dalee:


   invoke  GetCurrentThread
   invoke  SetThreadPriority,eax,THREAD_PRIORITY_TIME_CRITICAL




msg_loop:
   invoke  GetMessage,msHWND,0,0,0
   or      eax,eax
jz end_loop
   invoke  DispatchMessage,msHWND
jmp msg_loop
end_loop:
   invoke  ExitProcess,[msWPARAM]





proc WndProc, hwnd,wmsg,wparam,lparam
   push    ebx esi edi
   cmp     [wmsg],WM_DESTROY
je wmdestroy
   cmp     [wmsg],WM_COMMAND
je splcoo
   cmp     [wmsg],WM_LBUTTONDOWN
je play
   cmp     [wmsg],WM_RBUTTONDOWN
je play
   invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish




splcoo:
   cmp     [wparam],10068h
jne my
   invoke  SendMessage,[hlist],CB_GETCURSEL,0,0
   shl     eax,2
   add     eax,melofs
   mov     esi,[eax]
   mov     [mpos],esi
   add     eax,4
   mov     esi,[eax]
   mov     [mlast],esi
jmp my




play:
   mov     esi,[mpos]
   cmp     esi,[mlast]
je my
   xor     eax,eax
   mov     al,[esi]
   sub     al,40
   mov     ebx,96044
   mul     ebx
   add     eax,piano00
   invoke  PlaySound,eax,0,SND_MEMORY+SND_ASYNC
   inc     [mpos]
jmp my




wmdestroy:
   invoke  PostQuitMessage,0
my:
   xor     eax,eax
finish:
   pop     edi esi ebx
   ret
endp








section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL',\
          mm,'WINMM.DLL'

  import kernel,\
      GetModuleHandle,'GetModuleHandleA',\
      GetCurrentThread,'GetCurrentThread',\
      SetThreadPriority,'SetThreadPriority',\
      ExitProcess,'ExitProcess'

  import user,\
      RegisterClass,'RegisterClassA',\
      CreateWindowEx,'CreateWindowExA',\
      DefWindowProc,'DefWindowProcA',\
      GetMessage,'GetMessageA',\
      SendMessage,'SendMessageA',\
      DispatchMessage,'DispatchMessageA',\
      LoadCursor,'LoadCursorA',\
      LoadIcon,'LoadIconA',\
      PostQuitMessage,'PostQuitMessage'

  import mm,\
      PlaySound,'PlaySoundA'



section '.rsrc' resource data readable
directory RT_VERSION,versions,RT_MANIFEST,manifests
resource versions,1, LANG_NEUTRAL, version_info
versioninfo version_info,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_NEUTRAL,0,\
    'FileDescription', 'SplPiano',\
    'FileVersion', '1.0.0.0',\
    'InternalName', 'SplPiano',\
    'LegalCopyright', 'Copyright (C) 2025 Spl',\
    'OriginalFilename', 'SplPiano.exe',\
    'ProductName', 'SplPiano',\
    'ProductVersion', '1.0.0.0'
resource manifests,1,LANG_NEUTRAL,manifest_data
resdata manifest_data
        db '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
        db '<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">'
        db '<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">'
        db '  <security>'
        db '    <requestedPrivileges>'
        db '      <requestedExecutionLevel level="asInvoker" uiAccess="false"/>'
        db '    </requestedPrivileges>'
        db '  </security>'
        db '</trustInfo>'
        db '</assembly>'
endres




section '.data' data readable writeable



clsStyle          dd   0
clsLpfnWndProc    dd   WndProc
clsCbClsExtra     dd   0
clsCbWndExtra     dd   0
clsHInstance      dd   ?
clsHIcon          dd   ?
clsHCursor        dd   ?
clsHbrBackground  dd   COLOR_BTNFACE+1
clsLpszMenuName   dd   0
clsLpszClassName  dd   szClassName

szTitleName       db   'SplPiano',0
szClassName       db   'SplPiano',0
classbox          db   'COMBOBOX',0



melodies:
db 'Waltz-Joke, Dmitri Shostakovich',0
db 'Polonaise 13, Michal Kleofas Oginski',0
db 'The City of Gold, Vladimir Vavilov',0
db 'The Umbrellas of Cherbourg, Michel Legrand',0
db 'L Ete indien, Joe Dassin',0
db 'Minuet in G major, Bach',0
db 'Adagio in G minor, Remo Giazotto',0
db 'The Entertainer, Scott Joplin',0
db 'A Spruce Was Born in the Forest, Beckman',0
db 'String Quintet in E major, Boccherini',0
db 'America The Beautiful, Samuel A. Ward',0
db 'Jingle Bells, James Lord Pierpont',0
db 'The Very Same Munchhausen, Rybnikov',0
db 'Alla turca (Turkish March), Mozart',0
db 'Hava Nagila is a Jewish folk song',0
db 'Somewhere Far Away, Mikael Tariverdiev',0
db 'Hatikvah, Giuseppe Cenci',0
db 'Norma: Casta diva, Vincenzo Bellini',0


melody1:
db 79,80,82,82,82,82,82,84,82,79,80,82,82,82,82,82
db 84,82,87,86,87,86,84,77,77,80,82,84,84,84,84,84
db 86,84,80,82,84,84,84,84,84,86,84,89,87,86,84,81
db 82,79,79,80,82,82,82,82,82,84,82,79,80,82,82,82
db 82,82,84,82,91,89,87,86,83,84,84,92,89,84,89,84
db 89,84,89,91,87,83,84,83,84,83,84,87,84,80,79,77
db 82,79,82,87,87,87,87,87,87,87,77,82,87,87,87,87
db 87,87,87,89,91,92,84,86,91,87
melody2:
db 76,75,76,77,76,72,72,71,69,72,76,76,81,76,79,78,77,74,83
db 81,80,77,76,74,76,74,72,69,71,72,71,69,71,74,77,76,74,72
db 71,72,69,72,76,81,84,81,83,84,83,81,83,86,89,88,86,84,83
db 81,80,81,83,80,83,81,68,71,76,74,72,77,76,74,72,71,69,68
db 64,68,71,76,74,72,69,77,76,74,72,71,69,68,52,59,57,56,59
db 62,60,59,62,65,64,62,68,71,69,68,71,74,72,71,74,77,76,76
db 76,76,76,76,76,76,76,76,75,76,77,76,72,72,71,69,72,76,76
db 81,76,79,78,77,74,83,81,80,77,76,74,76,74,72,69,71,72,71
db 69,71,74,77,76,74,72,71,72,69,72,76,81,84,81,83,84,83,81
db 83,86,89,88,86,84,83,81,80,81,83,80,83,81,69,64,66,68,69
db 71,72,69,71,64,68,69,71,72,74,71,72,67,69,71,72,74,76,72
db 74,67,71,72,74,76,77,74,76,75,76,77,76,74,72,72,71,69,72
db 71,71,76,64,68,69,68,69,71,72,71,72,74,76,72,71,71,76,64
db 68,69,68,72,71,71,69
melody3:
db 52,60,59,57,56,57,52,64,62,60,59,60,57,65,64,62,60,59,60,62
db 65,64,62,60,62,59,52,60,59,57,56,57,52,64,62,60,59,60,57,65
db 64,62,60,59,60,62,65,64,62,60,62,59,64,64,55,55,55,55,53,52
db 53,53,62,62,53,53,53,53,52,50,52,52,47,50,53,57,62,60,59,57
db 57,56,47,50,53,57,62,60,59,57,57,56,57
melody4:
db 63,64,62,60,59,57,68,69,67,65,65,61,62,60,59,57,55,66,67,65,64,64
db 63,64,62,60,59,57,68,69,67,65,65,64,62,64,69,57,59,64,52,57
melody5:
db 72,69,64,64,69,72,71,69,71,68,64,69,70,69,67,64,62,61,61,62,64,67,65
db 64,65,77,74,70,70,74,77,76,74,76,72,69,72,69,75,72,72,71,69,71,76,77
db 76,77,76,77,76,77,52,57,59,60,59,57,52,52,57,59,60,64,67,65,59,59,60
db 62,60,62,64,62,64,65,64,62,60,59,59,60,55,60,62,60,59,57,56
melody6:
db 74,67,69,71,72,74,67,67,76,72,74,76,78,79,67,67,72,74,72,71,69
db 71,72,71,69,67,66,67,69,71,67,71,69,74,67,69,71,72,74,67,67,76,72
db 74,76,78,79,67,67,72,74,72,71,69,71,72,71,69,67,69,71,69,67,66,67
melody7:
db 74,72,70,69,67,67,66,75,74,72,70,69,69,67,79,77,79,75,77,74,75
db 77,75,77,74,75,72,74,75,74,75,72,74,70,72,74,79,81,82,81,79,78
db 79,77,62,63,65,63,62,60,72,75,79,74,70,74,79,72,68,70,72,70,68
db 67,67,69,70,69,67,66,66,67,69,67,66,67
melody8:
db 62,63,64,72,64,72,64,72,72,74,75,76,72,74,76,71,74,72,62,63,64
db 72,64,72,64,72,69,67,66,69,72,76,74,72,69,74,62,63,64,72,64,72
db 64,72,72,74,75,76,72,74,76,71,74,72,72,74,76,72,74,76,72,74,72
db 76,72,74,76,72,74,72,76,72,74,76,71,74,72
melody9:
db 60,69,69,67,69,65,60,60,60,69,69,70,67,72,72,62,62,70,70,69,67
db 65,60,69,69,67,69,65,72,62,62,70,70,69,67,65,60,69,69,67,69,65
melodya:
db 81,80,81,83,81,69,73,76,76,74,74,74,73,74,76,74,64,71,74,74,73,73
db 81,78,76,75,75,75,81,78,76,75,75,75,81,78,80,76,73,81,80,78,76,78,76
db 81,80,81,83,81,69,73,76,76,74,74,74,73,74,76,74,64,71,74,74,73,73,81
db 78,76,75,75,75,81,78,76,75,75,75,81,78,80,76,73,81,80,78,76,78,76
db 84,76,83,76,76,76,81,76,80,76,76,76,84,76,83,76,76,76,81,76,80,76,76,76
db 81,80,81,83,81,69,73,76,76,74,74,74,73,74,76,74,64,71,74,74,73,73,74,71
db 69,68,68,68,74,71,69,68,68,68,74,71,73,69,66,74,73,71,69,71,69
db 84,76,83,76,76,76,81,76,80,76,76,76,84,76,83,76,76,76,81,76,80,76,76,76
db 81,80,81,83,81,69,73,76,76,74,74,74,73,74,76,74,64,71,74,74,73,73,74,71
db 69,68,68,68,74,71,69,68,68,68,74,71,73,69,66,74,73,71,69,71,69
melodyb:
db 74,74,71,71,74,74,69,69,71,72,74,76,78,74,74,74,71,71,74,74,69,69,81
db 80,81,83,76,81,74,83,83,81,79,79,78,78,79,81,78,76,74,79,79,79,76,76
db 79,79,74,74,74,76,79,74,81,79
melodyc:
db 83,83,83,83,83,83,83,86,79,81,83,84,84,84,84,84,83,83,83,83,81,81,83,81
db 86,83,83,83,83,83,83,83,86,79,81,83,84,84,84,84,84,83,83,83,86,86,84,81,79
melodyd:
db 65,77,75,75,73,73,72,72,70,70,72,65,65,77,75,75,73,73
db 72,72,70,70,72,72,65,70,82,80,80,78,78,77,77,68,80,78
db 78,77,77,75,73,75,72,69,70,77,89,87,87,85,85,84,84,82
db 82,84,77,77,89,87,87,85,85,84,84,82,82,84,84,77,82,94
db 92,92,90,90,89,89,80,92,90,90,89,89,87,85,87,84,81,82
db 49,53,58,60,61,61,49,53,58,60,61,61,54,54,58,63,65,66
db 66,54,58,63,65,66,66,68,65,77,75,75,73,73,72,72,70,70
db 72,65,65,77,75,75,73,73,72,72,70,70,72,72,65,70,82,80
db 80,78,78,77,77,68,80,78,78,77,77,75,73,75,72,69,70,77
db 89,87,87,85,85,84,84,82,82,84,77,77,89,87,87,85,85,84
db 84,82,82,84,84,77,82,94,92,92,90,90,89,89,80,92,90,90
db 89,89,87,85,87,84,81,82
melodye:
db 71,69,68,69,72,74,72,71,72,76,77,76,75,76,83,81,80,81,83,81
db 80,81,84,81,84,83,81,79,81,83,81,79,81,83,81,79,78,76,71,69
db 68,69,72,74,72,71,72,76,77,76,75,76,83,81,80,81,83,81,80,81
db 84,81,84,83,81,79,81,83,81,79,81,83,81,79,78,76,76,77,79,79
db 81,79,77,76,74,67,76,77,79,79,81,79,77,76,74,72,74,76,76,77
db 76,74,72,71,64,72,74,76,76,77,76,74,72,71,71,69,68,69,72,74
db 72,71,72,76,77,76,75,76,83,81,80,81,83,81,80,81,84,81,83,84
db 83,81,80,81,76,77,74,72,71,69,69,71,73,69,71,73,71,69,68,66
db 68,69,71,68,64,69,71,73,69,71,73,71,69,68,66,71,68,64,69,85
db 86,85,83,81,83,81,80,78,81,80,78,77,78,80,77,73,75,77,73,78
db 77,78,80,81,80,81,83,85,84,85,84,85,86,85,83,81,83,81,80,78
db 81,80,78,76,78,80,76,73,75,76,73,75,76,78,75,72,73,75,72,73
db 85,86,85,83,81,83,81,80,78,81,80,78,77,78,80,77,73,75,77,73
db 78,77,78,80,81,80,81,83,85,84,85,84,85,86,85,83,81,83,81,80
db 78,81,80,78,76,78,80,76,73,75,76,73,75,76,78,75,72,73,75,72
db 73,76,74,73,71,69,71,73,74,76,78,80,81,81,80,78,76,76,74,73
db 71,69,71,73,74,76,78,80,81,82,83,76,74,73,71,69,71,73,74,76
db 78,80,81,81,80,78,76,76,74,73,71,73,76,69,73,71,74,68,71,69
melodyf:
db 62,62,66,63,62,66,66,69,67,66,67,67,70,69,67,66,63,66,63,66
db 62,62,66,63,62,66,66,69,67,66,67,67,70,69,67,66,63,66,63,62
db 66,66,63,62,62,62,63,63,62,60,60,60,60,63,62,60,60,67,66,63
db 66,63,62,66,66,63,62,62,62,63,63,62,60,60,60,60,63,62,60,60
db 67,66,63,66,63,62,67,67,67,67,67,67,67,67,70,69,67,70,69,67
db 67,67,70,69,67,70,69,67,69,69,72,70,69,72,70,69,69,69,72,70
db 69,72,70,69,69,69,74,69,69,74,62,62,74,72,70,69,67
melodyg:
db 72,64,64,71,69,71,63,63,71,62,62,69,68,69,61,61,69,60,60,69
db 68,69,59,59,59,62,64,65,65,64,62,62,60,60,64,62,60,59,57,60
db 59,72,64,64,71,69,71,63,63,71,62,62,69,68,69,61,61,69,60,60
db 69,68,69,59,59,59,62,64,65,64,62,64,65,69,68,69,71,64,72
melodyi:
db 69,74,76,77,79,81,81,82,81,82,86,81,79,79,76,77,77,76,74,76,77,74
db 69,74,76,77,79,81,81,82,81,82,86,81,79,79,76,77,77,76,74,76,77,74
db 74,86,86,86,84,86,84,82,81,74,86,86,86,84,86,84,82,81,79,79,76,77,77
db 79,81,82,84,81,79,77,79,79,77,77,77,76,74,76,77,74,79,79,76,77,77,79
db 81,82,84,81,79,77,79,79,77,77,77,76,74,76,77,74
melodyk:
db 69,70,69,67,69,72,70,69,67,67,65,69,67,65,65,67,69,65,67
db 69,70,69,67,69,74,72,74,72,72,70,69,70,70,72,70,69,70,74
db 72,70,69,69,72,70,66,67,67,69,70,67,74,72,74,72,70,70,69
db 68,68,69,69,74,76,74,73,76,70,68,69,77,76,74,76,74,73,76
db 70,72,72,74,72,74,72,71,72,71,72,74,76,77,79,81,81,81,81
db 82,81,79,77,79,77,76,74,76,74,72,70,72,70,69,67,74,72,71
db 72,76,77,72,69,69,67,66,67,71,72,70,67,65


melofs            dd   melody1
                  dd   melody2
                  dd   melody3
                  dd   melody4
                  dd   melody5
                  dd   melody6
                  dd   melody7
                  dd   melody8
                  dd   melody9
                  dd   melodya
                  dd   melodyb
                  dd   melodyc
                  dd   melodyd
                  dd   melodye
                  dd   melodyf
                  dd   melodyg
                  dd   melodyi
                  dd   melodyk
                  dd   melofs
mpos              dd   melody2
mlast             dd   melody3


splwav            db   'RIFF'
                  dd   96036
                  db   'WAVEfmt '
                  dd   16
                  dw   1
                  dw   2
discr             dd   48000
                  dd   192000
                  dw   4
                  dw   16
                  dd   'data'
                  dd   96000

multip            dd   10922
hzs               dd   131,139,147,156,165,175,185,196,208,220,233,247
                  dd   262,277,294,311,330,349,370,392,415,440,466,494
                  dd   523,554,587,622,659,698,740,784,831,880,932,988
                  dd   1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976
                  dd   2093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951
fin               dd   4186,4435,4699,4978,5274,5588,5920


hz                rd   1
scount            rd   1
otsch             rw   1
hwindow           rd   1
hlist             rd   1

msHWND            rd   1
msMESSAGE         rd   1
msWPARAM          rd   1
msLPARAM          rd   1
msTIME            rd   1
msPT              rd   2

piano00           rd   24011
piano01           rd   24011
piano02           rd   24011
piano03           rd   24011
piano04           rd   24011
piano05           rd   24011
piano06           rd   24011
piano07           rd   24011
piano08           rd   24011
piano09           rd   24011
piano10           rd   24011
piano11           rd   24011
piano12           rd   24011
piano13           rd   24011
piano14           rd   24011
piano15           rd   24011
piano16           rd   24011
piano17           rd   24011
piano18           rd   24011
piano19           rd   24011
piano20           rd   24011
piano21           rd   24011
piano22           rd   24011
piano23           rd   24011
piano24           rd   24011
piano25           rd   24011
piano26           rd   24011
piano27           rd   24011
piano28           rd   24011
piano29           rd   24011
piano30           rd   24011
piano31           rd   24011
piano32           rd   24011
piano33           rd   24011
piano34           rd   24011
piano35           rd   24011
piano36           rd   24011
piano37           rd   24011
piano38           rd   24011
piano39           rd   24011
piano40           rd   24011
piano41           rd   24011
piano42           rd   24011
piano43           rd   24011
piano44           rd   24011
piano45           rd   24011
piano46           rd   24011
piano47           rd   24011
piano48           rd   24011
piano49           rd   24011
piano50           rd   24011
piano51           rd   24011
piano52           rd   24011
piano53           rd   24011
piano54           rd   24011
piano55           rd   24011
piano56           rd   24011
piano57           rd   24011
piano58           rd   24011
piano59           rd   24011


SND_ASYNC=00001h
SND_MEMORY=00004h





