MidiOut音频输出设备

嗨嗨嗨~时隔1坤周我又双缀缀地来啦~

今天来讲midiOut。

midiOut就是一个音乐的输出设备。Windows的尿性,大家都懂,又是熟悉的Windows Application(不是这个连不了!)。

Coding,启动!

//开全局:
HMIDIOUT hMidiOut;

midiOutOpen(&hMidiOut, midiOutGetNumDevs() - 1, 0, 0, 0);

当然,演奏音符是得有的。

大家如果是肝帝,可以试试这个:

美妙的midiOut音符与数字对应表

如果你的肝已经逝世了,可以试试这个:

#include <string>
#include <unordered_map>

namespace std {
    unordered_map<string, long> table;
    string to_str(int x)
	{
		string ret = "", temp = "";
		if (x < 0)
		{
			ret = "-";
			x = -x;
		}
		while (x != 0)
		{
			temp = char(x % 10 + '0') + temp;
			x /= 10;
		}
		return ret + temp;
	}
    void init()
	{
		string each[13] = {"", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
		long num = 0;
		for (long i = -1; i <= 9; i++)
		{
			for (long j = 1; j <= 12; j++)
			{
				if (num == 127)
				{
					break;
				}
				string key = to_str(i) + each[j];
				table[key] = num++;
			}
		}
}

这个可以把一个形如

音阶+音符 

的字符串换成数字。

比如table["4C"]就是0x3c(一般用十六进制算)、table["4B"]就是0x47。

WM_DESTORY里记得midiOutReset(hMidiOut);和midiOutClose(hMidiOut);

然后就是演奏。

#define voice 0x7c
namespace std {
    struct Note {
        int stair;
        string note;
        int time;
    }
}

long value(long a, long b, long c) {
    return (c * 65536 + b * 256 + a);
}

void playNote(std::Note n)
{
    midiOutShortMsg(hMidiOut, value(0x95, std:table[std::to_str(n.stair) + n.note], voice));
    Sleep(n.time);
    midiOutShortMsg(hMidiOut, value(0x95, std:table[std::to_str(n.stair) + n.note], 0));
}

让后建议用一下<pthread>,不用就会只有把歌放完才可以执行别的操作。

完整代码:

#include <windows.h>
#include <pthread.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

HMIDIOUT hMidiOut;

namespace std {
	unordered_map<string, long> table;
	struct Note {
		int s;
		string n;
		int t;
	};
	vector<Note> song;
	string to_str(int x)
	{
		string ret = "", temp = "";
		if (x < 0)
		{
			ret = "-";
			x = -x;
		}
		while (x != 0)
		{
			temp = char(x % 10 + '0') + temp;
			x /= 10;
		}
		return ret + temp;
	}
	void init()
	{
		string each[13] = {"", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
		long num = 0;
		for (long i = -1; i <= 9; i++)
		{
			for (long j = 1; j <= 12; j++)
			{
				if (num == 127)
				{
					break;
				}
				string key = to_str(i) + each[j];
				table[key] = num++;
			}
		}
		Note n;
		n.s = 3;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "E";
		n.t = 2100; 
		song.push_back(n);
		n.s = 3;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 2100; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		for (int i = 1; i <= 2; i++)
		{
			n.s = 4;
			n.n = "A";
			n.t = 1050; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "A";
			n.t = 700; 
			song.push_back(n);
			n.s = 4;
			n.n = "B";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "A";
			n.t = 700; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "D";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 700; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "A";
			n.t = 1050; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "A";
			n.t = 350; 
			song.push_back(n);
			n.s = 5;
			n.n = "C";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "B";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 2100; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "A";
			n.t = 1050; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "A";
			n.t = 700; 
			song.push_back(n);
			n.s = 4;
			n.n = "B";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "A";
			n.t = 700; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "D";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 100; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "D";
			n.t = 350; 
			song.push_back(n);
			n.s = 3;
			n.n = "A";
			n.t = 700; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "D";
			n.t = 350; 
			song.push_back(n);
			n.s = 3;
			n.n = "A";
			n.t = 700; 
			song.push_back(n);
			n.s = 3;
			n.n = "G";
			n.t = 700; 
			song.push_back(n);
			n.s = 3;
			n.n = "A";
			n.t = 2100; 
			song.push_back(n);
			n.s = 4;
			n.n = "E";
			n.t = 350; 
			song.push_back(n);
			n.s = 4;
			n.n = "G";
			n.t = 350; 
			song.push_back(n);
		}
		n.s = 3;
		n.n = "A";
		n.t = 2100; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "E";
		n.t = 2100; 
		song.push_back(n);
		n.s = 3;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "G";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "C";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 4;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "G";
		n.t = 700; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 2100; 
		song.push_back(n);
		n.s = 5;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 5;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 5;
		n.n = "E";
		n.t = 350; 
		song.push_back(n);
		n.s = 5;
		n.n = "D";
		n.t = 350; 
		song.push_back(n);
		n.s = 3;
		n.n = "A";
		n.t = 700; 
		song.push_back(n);
		n.s = 4;
		n.n = "G";
		n.t = 100; 
		song.push_back(n);
		n.s = 4;
		n.n = "A";
		n.t = 2800; 
		song.push_back(n);
	}
}

long value(long a, long b, long c)
{
	return long(c * 65536 + b * 256 + a);
}

int voice;

void playNote(std::Note n)
{
	midiOutShortMsg(hMidiOut, value(0x95, std::table[std::to_str(n.s) + n.n], voice));
	Sleep(n.t);
	midiOutShortMsg(hMidiOut, value(0x95, std::table[std::to_str(n.s) + n.n], 0));
}

bool flag = 0;

void* play(void* arg)
{
	flag = 1;
	voice = 0x7f;
	for (int i = 0; i < std::song.size(); i++)
	{
		playNote(std::song[i]);
		Sleep(10);
	}
	flag = 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
		case WM_DESTROY: {
			midiOutReset(hMidiOut);
			midiOutClose(hMidiOut);
			PostQuitMessage(0);
			break;
		}
		case WM_COMMAND: {
			if (flag) break;
			pthread_t tid;
			pthread_create(&tid, NULL, play, NULL);
			Sleep(1000);
			break;
		}
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	midiOutOpen(&hMidiOut, midiOutGetNumDevs() - 1, 0, 0, 0);
	std::init();
	WNDCLASSEX wc;
	HWND hwnd;
	MSG msg;
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc;
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}
	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Music",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		180,
		205,
		NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}
	CreateWindow("Button", "Play: 穿越时空的思念", WS_VISIBLE | WS_CHILD, 0, 0, 160, 160, hwnd, (HMENU)1, NULL, NULL);
	while(GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值