用C++midi播放只因你太美

用C++midi播放只因你太美

没有怎么接触过音乐,加上哥哥的那段rap的调太难了
整体没有做到很相似,不过还是能凑合着听一下的
还是得说一下,我家哥哥真有才(doge)
只能通过visual studio运行

#include <iostream>

#include <Windows.h>

#pragma comment(lib,"winmm.lib")

using namespace std;



enum Scale

{

    Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,

    D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,

    E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,

    F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,

    F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,

    G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,

    G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,

    A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,

    A0s = 22, A0 = 21

};
enum Voice

{

    X1 = C2, X2 = D2, X3 = E2, X4 = F2, X5 = G2, X6 = A2, X7 = B2,

    L1 = C3, L2 = D3, L3 = E3, L4 = F3, L5 = G3, L6 = A3, L7 = B3,

    M1 = C4, M2 = D4, M3 = E4, M4 = F4, M5 = G4, M6 = A4, M7 = B4,

    H1 = C5, H2 = D5, H3 = E5, H4 = F5, H5 = G5, H6 = A5, H7 = B5,

    LOW_SPEED = 500, MIDDLE_SPEED = 300, HIGH_SPEED = 150,

    _ = 0XFF,

};

void JNTM()

{

    HMIDIOUT handle;

    midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);

    //midiOutShortMsg(handle,32<<8+0xC0);

    int volume = 0x7f;

    int voice = 0x0;

    int sleep = 350;

    int jntm[] =

    {
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//34
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,//30
        300,_,150,L6,L6,300,L6,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//38
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//39
        150,_,150,L6,L6,M3,L6,L6,L6,150,L6,L6,L6,L6,150,L6,L6,L6,L6,//19
        150,L6,150,L6,L6,150,M1,L6,150,M3,150,L6,L6,L6,//14
        150,L6,L6,L6,L6,150,L6,150,L6,L6,150,L6,L6,150,L6,_,300,_,//18
        150,L6,L6,M2,M3,150,_,150,M2,M3,150,_,150,M2,M3,150,_,150,L6,//19
        150,_,L3,150,L3,150,L3,L3,150,L3,150,L3,L3,150,M5,150,M6,M6,150,L6,//20
        150,_,L6,150,L6,150,L6,L6,150,L6,150,L6,L6,150,M3,150,M3,M3,L6,//19
        150,L6,L6,L6,L6,150,L6,L6,L6,L6,300,L6,300,M2,150,M2,//16
        150,L6,L6,150,M2,M3,L6,L6,150,M2,M3,L6,L6,150,M2,M2,L6,L6,300,M3,M3,//21
        300,_,150,_,L6,150,M3,M4,M3,M4,300,M3,L6,//13 r
        300,_,150,_,L6,150,L5,L6,L6,L5,300,L6,L6,300,L3,_,//16
        300,_,150,L6,L6,300,M3,150,M3,M4,300,M3,L6,//13
        300,_,150,_,L6,150,L5,L6,L6,L5,300,L6,L6,300,M1,//15
        500,M4,500,M3,//4r
        300,L6,L6,_,L6,300,L6,_,150,M3,M4,M3,M4,300,M3,L6,//16r
        300,_,300,_,L6,150,L5,L6,L6,L5,300,L6,L6,300,L3,_,//16
        300,_,L6,150,L5,L6,L6,L5,300,L6,L6,300,M1,//13
        300,H1,300,M7,M5,M5,M3,300,M3,M3,300,H1,300,M7,M5,300,M5,M3,M3,300,M5,//21
        300,_,150,M3,M3,150,M3,300,M5,M5,300,M5,M6,300,M7,//15
        150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//31
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,//28
        300,_,150,L6,L6,300,L6,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//38
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//39
        500,M4,500,M3,//4
        300,_,150,L6,L6,300,M3,150,L6,L6,150,L6,L6,M3,300,_,150,M3,M3,150,_,M2,M2,M2,150,M1,M1,L7,//28
        500,M4,500,M3,//4
        300,_,150,M5,M5,300,M5,M5,300,M5,M6,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//26
        500,M4,500,M3,//4
        300,_,150,L6,L6,300,M3,150,L6,L6,150,L6,L6,M3,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//29
        500,M4,500,M3,//4
        300,_,150,M5,M5,300,M5,M5,300,M5,M6,//11
        300,H1,M7,300,M6,M7,300,H1,M7,300,M7,M6,M6,//13
        150,L6,L6,300,L6,L6,300,L6,//8
        150,L6,L6,300,L6,300,L6,//7
        150,L6,L6,300,L6,L6,300,L6,//8
        300,L6,L6,175,M3,L6,300,L6,//8
        150,L6,150,L6,L6,150,L6,300,L6,L6,150,L6,//12
        300,L6,L6,150,L6,150,L6,L6,//8
        300,L6,200,L6,L6,300,L6,160,L6,L6,300,L6,150,L6,L6,//15
        300,L6,300,L6,L6,//5
        150,M2,L6,L6,L6,150,L6,L6,L6,L6,150,L6,L6,L6,L6,150,L6,300,M2,//19
        150,L6,M2,L6,L6,L6,150,M2,L6,L6,L6,150,L6,L6,L6,L6,150,L6,150,M2,//20
        300,M2,L6,300,L6,//5
        150,L6,L6,L6,300,M3,L6,175,M2,//9
        150,L6,L6,M2,M3,M2,M3,150,M2,M3,M2,M3,150,M3,M3,M3,M3,150,M3,M3,//20
        300,_,150,_,L6,150,M3,M4,M3,M4,300,M3,L6,//13
        300,_,150,_,L6,150,L5,L6,L6,L5,300,L6,L6,L3,_,//15
        150,_,150,L6,L6,150,M3,M4,M3,M4,160,M3,L6,//13
        300,_,150,_,L6,150,L5,L6,L6,L5,160,L6,L6,300,M1,//15
        500,M4,500,M3,//4
        150,L6,L6,150,_,L6,150,L6,_,150,M3,M4,M3,M4,160,M3,L6,//17
        300,_,150,_,L6,150,L5,L6,L6,L5,150,L6,L6,150,L3,_,//16
        150,_,L6,150,L5,L6,L6,L5,150,L6,L6,300,M1,//13
        300,H1,150,M7,M5,150,M5,M3,150,M3,M3,300,H1,150,M7,M5,150,M5,M3,M3,300,M5,//22
        300,_,150,M3,M3,150,M3,160,M5,M5,150,M5,M6,150,M7,//15
        150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//31
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,//28
        300,_,150,L6,L6,300,L6,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//38
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,150,_,//41
        150,_,300,_,M5,300,M5,M3,300,M3,M4,300,M4,M3,300,M3,M2,300,M2,M1,300,M2,M3,//23
        150,_,L6,L6,L5,150,L6,L5,L5,L5,300,L6,150,L6,L6,//15
        150,L6,L5,L5,L5,300,L6,L5,150,L6,L6,L6,150,_,//14
        150,_,180,_,M5,180,M5,M3,180,M3,M4,180,M4,M3,180,M2,M2,180,M1,M1,180,M2,M3,//23
        180,M3,L6,M5,150,L6,L5,150,L6,L5,150,L6,300,L6,L6,//15
        150,L6,L6,L6,L6,150,L6,L5,L6,L5,180,L6,L6,180,L6,//15
        150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//31
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,//28
        300,_,150,L6,L6,300,L6,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,//38
        300,_,150,L6,L6,300,M3,M3,300,L6,150,_,M6,M6,M6,300,_,150,M3,M3,300,_,M4,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//39
        500,M4,500,M3,//4
        150,_,150,L6,L6,300,M3,150,L6,L6,150,L6,L6,150,M3,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//30
        500,M4,500,M3,//4
        300,_,150,M5,M5,300,M5,M5,300,M5,M6,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//26
        500,M4,500,M3,//4
        150,_,150,L6,L6,300,M3,150,L6,L6,150,L6,L6,150,M3,300,_,150,M3,M3,150,_,M2,M2,M2,150,_,M1,M1,L7,//30
        500,M4,500,M3,//4
        300,_,150,M5,M5,300,M5,M5,300,M5,M6,//11
        300,H1,M7,300,M6,M7,300,H1,M7,300,M7,M6,300,M6,300,M6,300,M6,300,M6
    };
    int cnt = 0;
    for (auto i : jntm) {
        cnt += 1;
        if (cnt == 1) cout << "只因你太美 baby\n";
        if (cnt == 34) cout << "只因你太美 baby\n";
        if (cnt == 64) cout << "只因你实在是太美 baby\n";
        if (cnt == 102) cout << "只因你太美 baby\n";
        if (cnt == 141) cout << "迎面走来的你让我如此蠢蠢欲动\n";
        if (cnt == 160) cout << "这种感觉我从未有\n";
        if (cnt == 174) cout << "Cause I got a crush on you who you\n";
        if (cnt == 192) cout << "你是我的,我是你的谁\n";
        if (cnt == 211) cout << "再多一眼 看一眼 就会爆炸\n";
        if (cnt == 231) cout << "再近一点 靠近点 快被融化\n";
        if (cnt == 250) cout << "想要把你占为己有 baby bae\n";
        if (cnt == 266) cout << "不管走到哪里都会想起的人 是你 you you\n";
        if (cnt == 287) cout << "我应该拿你怎样\n";
        if (cnt == 300) cout << "所有人都在看着你\n";
        if (cnt == 316) cout << "我的心总是不安\n";
        if (cnt == 329) cout << "我现在已病入膏肓\n";
        if (cnt == 344) cout << "eh oh\n";
        if (cnt == 348) cout << "难道 真的因你而疯狂吗\n";
        if (cnt == 364) cout << "我本来不是这种人\n";
        if (cnt == 380) cout << "因你而变成奇怪的人\n";
        if (cnt == 393) cout << "第一次呀变成这样的我\n";
        if (cnt == 414) cout << "不管我怎么去否认\n";
        if (cnt == 429) cout << "只因你太美 baby\n";
        if (cnt == 460) cout << "只因你太美 baby\n";
        if (cnt == 488) cout << "只因你实在是太美 baby\n";
        if (cnt == 526) cout << "只因你太美 baby\n";
        if (cnt == 565) cout << "eh oh\n";
        if (cnt == 569) cout << "现在确认的告诉我\n";
        if (cnt == 597) cout << "eh oh\n";
        if (cnt == 601) cout << "你到底属于谁\n";
        if (cnt == 627) cout << "eh oh\n";
        if (cnt == 631) cout << "现在确认的告诉我\n";
        if (cnt == 660) cout << "eh oh\n";
        if (cnt == 664) cout << "你到底属于谁\n";
        if (cnt == 675) cout << "就是现在告诉我\n";
        if (cnt == 688) cout << "跟着那节奏\n";
        if (cnt == 696) cout << "缓缓 make wave\n";
        if (cnt == 703) cout << "甜蜜的奶油\n";
        if (cnt == 711) cout << "It's your birthday cake\n";
        if (cnt == 719) cout << "男人们的game\n";
        if (cnt == 731) cout << "call me 你恋人\n";
        if (cnt == 739) cout << "别被欺骗 愉快的\n";
        if (cnt == 754) cout << "I wanna play\n";
        if (cnt == 759) cout << "我的脑海每分每秒为你一人沉醉\n";
        if (cnt == 778) cout << "最迷人让我神魂颠倒是你身上香水\n";
        if (cnt == 798) cout << "oh right baby\n";
        if (cnt == 803) cout << "I'm fall in love with you\n";
        if (cnt == 812) cout << "我的一切你都拿走 只要有你就已足够\n";
        if (cnt == 832) cout << "我到底应该怎样\n";
        if (cnt == 845) cout << "我的心一直很不安\n";
        if (cnt == 860) cout << "其他男人们的视线\n";
        if (cnt == 873) cout << "全都只看着你的脸\n";
        if (cnt == 888) cout << "eh oh\n";
        if (cnt == 892) cout << "难道 真的因你而疯狂吗\n";
        if (cnt == 909) cout << "我本来不是这种人\n";
        if (cnt == 925) cout << "因你而变成奇怪的人\n";
        if (cnt == 938) cout << "第一次呀变成这样的我\n";
        if (cnt == 960) cout << "不管我怎么去否认\n";
        if (cnt == 975) cout << "只因你太美 baby\n";
        if (cnt == 1006) cout << "只因你太美 baby\n";
        if (cnt == 1034) cout << "只因你实在是太美 baby\n";
        if (cnt == 1072) cout << "只因你太美 baby\n";
        if (cnt == 1113) cout << "我愿意把我的全部都给你\n";
        if (cnt == 1136) cout << "我每天在梦里都梦见你\n";
        if (cnt == 1151) cout << "还有我闭着眼睛也能看到你\n";
        if (cnt == 1165) cout << "现在开始我只准你看我\n";
        if (cnt == 1188) cout << "I don't wanna wake up in dream\n";
        if (cnt == 1203) cout << "我只想看你 这是真心话\n";
        if (cnt == 1218) cout << "只因你太美 baby\n";
        if (cnt == 1249) cout << "只因你太美 baby\n";
        if (cnt == 1277) cout << "只因你实在是太美 baby\n";
        if (cnt == 1315) cout << "只因你太美 baby\n";
        if (cnt == 1354) cout << "eh oh\n";
        if (cnt == 1358) cout << "现在确认的告诉我\n";
        if (cnt == 1388) cout << "eh oh\n";
        if (cnt == 1392) cout << "你到底属于谁\n";
        if (cnt == 1418) cout << "eh oh\n";
        if (cnt == 1422) cout << "现在确认的告诉我\n";
        if (cnt == 1452) cout << "eh oh\n";
        if (cnt == 1456) cout << "你到底属于谁\n";
        if (cnt == 1467) cout << "就是现在告诉我\n";
        //cout << cnt << "\n";
        if (i == LOW_SPEED || i == HIGH_SPEED || i == MIDDLE_SPEED) {

            sleep = i;//Sleep(i/2);

            continue;

        }

        if (i == 0) { sleep = 175; continue; }

        if (i == 700) { Sleep(175); continue; }

        if (i == _) {

            Sleep(350);

            continue;

        }

        // if (i == 900) volume += 100;

        voice = (volume << 16) + ((i) << 8) + 0x90;

        midiOutShortMsg(handle, voice);

        //cout << voice << endl;
        Sleep(sleep);

    }

    midiOutClose(handle);

}



int main()

{



    JNTM();

    return 0;

}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在沉寂了一段时间之后。我开始开发游戏的音频程序了。今天我要为大家展示的是我写的播放MIDI的程序,其实不要以为MIDI的载入和播放很复杂,其实它是相当的简单、只需要选用合适的解码器就行了。现在又几种解码器可以选择。MCI和DirectMusic。其中MCI是windows特别对多媒体应用程序提供的API集合,它可以播放很多流行的格式。但是对MIDI的控制性比较低。而DirectMusic则对MIDI有着较丰富的支持,最典型的就是可以控制节奏(tempo)。 我的代码没有对DirectMusic进行封装,使用C的风格制作的。所以大家看起来很好理解。下面我就来展示我写的代码吧。 Main.cpp /*--------------------------------------------------------------------------- 蒋轶民制作E-mail:jiangcaiyang123@163.com 最后编辑:年月日:29:06 文件名:main.cpp 作用:头文件的实现 ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ // 头文件 #include #include #include "main.h" using namespace std; int main( int, char** ) { try { cout << "初始化设备\n"; Initialize();// 初始化DirectMusic cout << "载入声音\n"; LoadSound( TEXT( "test.mid" ) ); // 载入声音文件 cout <SetRepeats( NULL ); // 仅仅播放一次 SetVolume( 0, 0 ); Play(); Sleep( 1000 ); SetTempo( 160 ); cout << "当前播放的速率为" << GetCurrentTempo() << '\n'; while ( IsPlaying() ); UnInitialize(); cout << "释放设备\n"; } catch( CError& e ) { e.SaveToFile(); cout << "错误报告已保存。\n"; } catch( ... ) { cout << "遇到了未知的错误。\n"; } return 0; }
你想了解如何在C++中编写一个MIDI音乐程序来模拟吉他吗?是的话,我可以提供一些指导。 首先,你需要了解MIDI协议的基本知识。MIDI(Musical Instrument Digital Interface)是一种数字音乐通信协议,它允许不同的音乐设备之间进行通信。通过发送MIDI消息,你可以控制音符、节奏、音量等。 在C++中,你可以使用第三方库来处理MIDI。一个常用的库是RtMidi,它提供了一个简单的接口来发送和接收MIDI消息。你可以使用该库来创建一个MIDI输出设备,并通过发送MIDI消息来模拟吉他音符。 以下是一个简单的示例代码,展示了如何使用RtMidi库来发送MIDI消息: ```cpp#include <iostream> #include "RtMidi.h" int main() { RtMidiOut midiOut; // 打开默认的MIDI输出设备 midiOut.openVirtualPort("Virtual MIDI Guitar"); // 发送音符消息 unsigned char message[3]; int note =60; // MIDI音符60代表C4音符 int velocity =100; // 音符的力度 message[0] =0x90; // 指定消息类型为Note On message[1] = note; // 指定音符 message[2] = velocity; // 指定力度 midiOut.sendMessage(message,3); // 延时一段时间 Sleep(1000); // 如果你在Windows上编译,可以使用Sleep函数 // 发送Note Off消息来停止音符 message[0] =0x80; // 指定消息类型为Note Off message[2] =0; // 力度设置为0,停止音符 midiOut.sendMessage(message,3); // 关闭MIDI输出设备 midiOut.closePort(); return0; } ``` 这只是一个基本示例,你可以根据需要进行扩展。你可以通过修改音符、力度和延时时间来模拟吉他的不同音符和弹奏技巧。 希望这对你有帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值