嗨嗨嗨~时隔1坤周我又双缀缀地来啦~
今天来讲midiOut。
midiOut就是一个音乐的输出设备。Windows的尿性,大家都懂,又是熟悉的Windows Application(不是这个连不了!)。
Coding,启动!
//开全局:
HMIDIOUT hMidiOut;
midiOutOpen(&hMidiOut, midiOutGetNumDevs() - 1, 0, 0, 0);
当然,演奏音符是得有的。
大家如果是肝帝,可以试试这个:
如果你的肝已经逝世了,可以试试这个:
#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;
}