⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vpiano.asm

📁 钢琴模拟发声 汇编语言编写
💻 ASM
字号:
.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\winmm.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\winmm.lib



.data
ClassName db "SimpleWinClass",0
AppName  db "SimpleVirtualPiano",0
szText   db	'This is a Simple VirtualPiano----------->made bu liuwei  2003.11.19',0h

.data?
hInstance HINSTANCE ?
hdc HDC ?
midiFlag BYTE ?
midiPu DWORD ?
midiYu DWORD ?
midiPlayFlag BYTE ?


.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
	invoke WinMain, hInstance,NULL,NULL,SW_SHOWDEFAULT
	invoke ExitProcess,eax      

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
	LOCAL wc:WNDCLASSEX
	LOCAL msg:MSG
	LOCAL hwnd:HWND
	mov   wc.cbSize,SIZEOF WNDCLASSEX
	mov   wc.style, CS_HREDRAW or CS_VREDRAW
	mov   wc.lpfnWndProc, OFFSET WndProc
	mov   wc.cbClsExtra,NULL
	mov   wc.cbWndExtra,NULL
	push  hInst
	pop   wc.hInstance
	mov   wc.hbrBackground,COLOR_WINDOW+1
	mov   wc.lpszMenuName,NULL
	mov   wc.lpszClassName,OFFSET ClassName
	invoke LoadIcon,NULL,IDI_APPLICATION
	mov   wc.hIcon,eax
	mov   wc.hIconSm,eax
	invoke LoadCursor,NULL,IDC_ARROW
	mov   wc.hCursor,eax
	invoke RegisterClassEx, addr wc
	INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInst,NULL
	mov   hwnd,eax
	INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
	INVOKE UpdateWindow, hwnd
      invoke midiOutOpen,ADDR hdc,-1,NULL,NULL,NULL
      mov   midiYu,0h
      mov   midiPlayFlag,1h
	.WHILE TRUE
                INVOKE GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                INVOKE TranslateMessage, ADDR msg
                INVOKE DispatchMessage, ADDR msg
	.ENDW
	mov     eax,msg.wParam
	ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
		local	 @stPs:PAINTSTRUCT
		local	 @stRect:RECT
		local	 @hDc  
            local   @playf:WORD

	.IF uMsg==WM_DESTROY
                  invoke midiOutClose,hdc
		    invoke PostQuitMessage,NULL
                    
      .ELSEIF uMsg ==WM_PAINT
			invoke	BeginPaint,hWnd,addr @stPs
			mov	      @hDc,eax
			invoke	GetClientRect,hWnd,addr @stRect
			invoke	DrawText,@hDc,addr szText,-1,\
				addr @stRect,\
				DT_SINGLELINE or DT_CENTER or DT_VCENTER
			invoke	EndPaint,hWnd,addr @stPs
      .ELSEIF uMsg==WM_CHAR
      mov @playf,0h
      push wParam
      pop midiPu
;===============ESC键的功能================
          .if midiPu==WM_DEVMODECHANGE                   ;1bh
           invoke midiOutClose,hdc
	    invoke	PostQuitMessage,NULL
          .ENDIF
;----------------------------------------


        .if midiPu==61h
        mov midiYu,-24
        .elseif midiPu==62h
        mov midiYu,-12
        .elseif midiPu==63h
        mov midiYu,0
        .elseif midiPu==64h
        mov midiYu,12
        .elseif midiPu==65h
        mov midiYu,24
      
        ;===============全音============================
        .elseif midiPu==31h
        mov midiPu,3ch
        mov @playf,1
        .elseif midiPu==32h
        mov midiPu,3eh
        mov @playf,1
        .elseif midiPu==33h
        mov midiPu,40h
        mov @playf,1
        .elseif midiPu==34h
        mov midiPu,41h
        mov @playf,1
        .elseif midiPu==35h
        mov midiPu,43h
        mov @playf,1
        .elseif midiPu==36h
        mov midiPu,45h
        mov @playf,1
        .elseif midiPu==37h
        mov midiPu,47h
        mov @playf,1
        ;================半音===========================
         .elseif  midiPu==71h
         mov midiPu,3dh
         mov @playf,1
         .elseif  midiPu==77h
         mov midiPu,3fh
         mov @playf,1
         .elseif  midiPu==72h
         mov midiPu,42h
         mov @playf,1
         .elseif  midiPu==74h
         mov midiPu,44h
         mov @playf,1
         .elseif  midiPu==79h
         mov midiPu,46h
         mov @playf,1
         .endif
        ;-------------------------------------------
          .if @playf==1
            mov eax,midiYu
            add midiPu,eax
            mov cl,8
            shl midiPu,cl
            and midiPu,0ff00h
            add midiPu,680090h
           .if midiPlayFlag==1h
            ;================调用声卡的代码======================      
        
            invoke midiOutShortMsg,hdc,midiPu
            mov  midiPlayFlag,0h
            ;-------------------声卡代码结束------------------------
            .endif
            .endif
	.ELSEIF uMsg==WM_KEYUP
      	    mov midiPlayFlag,1h
	.ELSE
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam
		ret
	.ENDIF
	xor    eax,eax
	ret
WndProc endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -