Featured image of post Sử dụng C++ để gọi MIDI trình diễn bài ca trường của Đại học Sư phạm Qufu - j88vip1

Sử dụng C++ để gọi MIDI trình diễn bài ca trường của Đại học Sư phạm Qufu - j88vip1

Tham gia trải nghiệm trò chơi độc đáo trên J88VIP1 và nhận các ưu đãi đặc biệt chỉ có tại J88VIP1

Một ngày nọ, khi tôi lướt trên Bilibili (B站), tôi nhìn thấy một người dùng đã sử dụng ngôn ngữ lập trình C++ để tạo ra j88 casino âm nhạc. Ban đầu, tôi không biết rằng đó là nhờ việc sử dụng các hàm MIDI. Sau khi tìm kiếm thông tin từ Google và tham khảo thêm tài liệu trên CSDN, tôi đã hiểu rõ hơn về cách thức hoạt động của phương pháp này. Ngay sau đó, tôi quyết định tự viết mã nguồn cho bài ca trường của chính trường đại học mình.

Chuẩn bị ban đầu

Trước tiên, bạn cần chuẩn bị bản nhạc cụ thể của bài ca trường. Thông thường, nội dung này có thể được tìm thấy trong thư mời nhập học mà bạn nhận được. Tiếp theo, bạn cần cài đặt một trình biên dịch C++. Trong trường hợp của tôi, tôi đang sử dụng Visual Studio 2022. Cuối cùng, kiến thức cơ bản về lý thuyết âm nhạc cũng rất quan trọng. Vì tôi là sinh viên kỹ thuật thuần túy, nên tôi gần như không hiểu gì về âm nhạc. Tôi chỉ có thể phân biệt thang âm cơ bản nhưng không nắm vững tiết tấu. May mắn thay, tôi đã tìm thấy sự giúp đỡ từ một chị khóa 19 và một bạn khóa 22 qua nhóm chat trực tuyến.

Viết mã nguồn

Hàm Scale

Hàm này đóng vai trò như một bảng tra cứu giữa ký hiệu nhạc đơn giản với các giá trị MIDI tương ứng. Nó j88 tặng 50k giống như một bảng mã hóa Base64:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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
};

Hàm Voice

Đây là hàm điều khiển chất lượng âm thanh:

1
2
3
4
5
6
7
8
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 = 400, HIGH_SPEED = 300,
    _ = 0XFF
};

Biên soạn nhạc phổ

Phần quan trọng nhất là chuyển đổi nhạc phổ thành mã lệnh máy tính:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
void QFNU(){
    HMIDIOUT handle;
    midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
    int volume = 0x7f;
    int voice = 0x0;
    int sleep = 300;

    int QFNU[] = {
        M1,_,M1,_,M1,_,M2,_,
        M3,_,M5,_,M5,_,_,_,
        M6,_,M6,_,M5,_,M3,_,
        M1,_,M2,M3,M2,_,_,_,
        M3,_,M3,_,M5,_,M5,_,
        M3,_,M2,_,M1,_,L6,_,
        L5,L6,M1,M2,M3,_,M5,_,
        M2,_,_,_,_,_,
        M1,_,M1,_,M1,_,M2,_,
        M3,_,M5,_,M5,_,_,
        M6,_,M6,_,M5,_,M3,_,
        M1,_,M2,M3,M2,_,_,
        M3,_,M3,_,M5,_,M5,_,
        M3,_,M2,_,M1,_,L6,_,
        L5,L6,M1,M2,M3,_,M2,_,
        M1,_,_,_,_,_,
        H1,_,H1,_,H1,_,_,_,
        M3,_,M5,M6,M5,_,_,_,
        M6,_,M5,_,M4,_,M1,_,
        M7,_,M6,M7,M5,_,_,_,
        M6,_,H1,_,H1,_,H1,_,
        M3,_,M5,M6,M6,_,M6,_,
        M6,M5,M4,M4,M4,_,_,_,
        M2,M2,M2,M3,_,M2,_,_,_,
        H1,_,H1,_,H1,_,_,_,
        M3,_,M5,M6,M5,_,_,_,
        M6,_,M5,_,M4,_,M1,_,
        M7,_,M6,M7,M5,_,_,_,
        M6,_,H1,_,H1,_,H1,_,
        M3,M3,M5,M6,M6,_,_,_,
        M2,M3,M5,M5,M5,M5,M5,M5,_,
        H2,_,H2,_,M6,_,M7,_,
        H1,H1,H1,H1,H1,H1,
    };

    for(auto i : QFNU){
        if(i == LOW_SPEED || i == HIGH_SPEED || i == MIDDLE_SPEED){
            sleep = i;
            continue;
        }
        if(i == 0) { sleep = 150; continue; }
        if(i == 700) { Sleep(150); continue; }
        if(i == _){
            Sleep(300);
            continue;
        }
        voice = (volume << 16) + ((i) << 8) + 0x90;
        midiOutShortMsg(handle, voice);
        cout << voice << endl;
        Sleep(sleep);
    }
    midiOutClose(handle);
}

Hàm main

Cuối cùng, bạn chỉ cần gọi hàm QFNU từ hàm main để bắt đầu trình diễn:

1
2
3
4
int main(){
    QFNU(); // Chạy bài ca trường
    return 0;
}

Mã nguồn hoàn chỉnh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#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 = 400, HIGH_SPEED = 300,
    _ = 0XFF
};

void QFNU(){
    HMIDIOUT handle;
    midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
    int volume = 0x7f;
    int voice = 0x0;
    int sleep = 300;

    int QFNU[] = {
        // Các đoạn nhạc tương tự phần trước đây
    };

    for(auto i : QFNU){
        if(i == LOW_SPEED || i == HIGH_SPEED || i == MIDDLE_SPEED){
            sleep = i;
            continue;
        }
        if(i == 0) { sleep = 150; continue; }
        if(i == 700) { Sleep(150); continue; }
        if(i == _){
            Sleep(300);
            continue;
        }
        voice = (volume << 16) + ((i) << 8) + 0x90;
        midiOutShortMsg(handle, voice);
        cout << voice << endl;
        Sleep(sleep);
    }
    midiOutClose(handle);
}

int main(){
    QFNU(); // Chạy bài ca trường
    return 0;
}

Tổng kết và xử lý hậu kỳ

Sau khi hoàn thiện chương trình, tôi đã thực hiện một số chỉnh sửa video đơn giản và đăng tải lên tài khoản Douyin chính thức của Đại học Sư phạm Qufu. Video đã nhận được nhiều phản hồi tích cực!

Bạn có thể xem video bằng cách sao chép mã sau vào ứng dụng Douyin:

1
7.94 SYm:/ Hãy cùng thưởng thức bài ca trường tuyệt vời của chúng ta! #Đại_học_Sư_phạm_Qufu #lập_trình #công_nghệ #đại_học #âm_nhạc
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack thiết kế bởi Jimmy