原琴小工具

 
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
int yc=10,wait=5;//显示延迟 ,演奏延迟 
bool ED;
char opt;
vector<char>music[110000];
int n=0,tot=0;
int L[110000],R[110000],autowait[110000];
void display(char *s)
{
    while(1)
    {
        if(*s!=0)
            printf("%c",*s++);
        else
            break;
        Sleep(yc);
    }
    return;
}
void play(char x)
{
    keybd_event(x,0,0,0);
    keybd_event(x,0,KEYEVENTF_KEYUP,0);
    return;
}
void welcome()
{
    system("cls"); 
    puts("欢迎使用原琴辅助——byHKHbest");
    Sleep(500);
    return;
}
void About() 
{
    system("cls");
    display("本软件的代码全部有HKHbest编写,开源且遵循GPL协议。\n");
    display("但由于HKHbest的网速原因QWQ,目前没有在GitHub上发表,目前只会在我的博客https://www.cnblogs.com/HKHbest/p/15859274.html,并在个人朋友圈和QQ空间分享相关消息。\n");
    display("你看到的这个版本只是一个实验版,预计未来会加入图像界面,启动弹琴的快捷键,和快速制作曲谱的相关功能。\n");
    getch();
    return; 
}
void Setting() 
{
    system("cls");
    display("输入数字进行选择:\n");
    if(yc==50)
        display("1.取消显示延迟。\n");
    else
        display("1.添加显示延迟。\n");
    display("2.调整弹奏准备时间:当前为");
    printf("%d",wait);
    display("秒。\n");
    opt=getch();
    if(opt=='1')
        if(yc==50)
            yc=0;
        else
            yc=50;
    else
    {
        system("cls");
        display("\n输入数字进行选择:\n");
        display("1.调整弹奏准备时间为1秒。\n");
        display("2.调整弹奏准备时间为2秒。\n");
        display("3.调整弹奏准备时间为3秒。\n");
        display("4.调整弹奏准备时间为4秒。\n");
        display("5.调整弹奏准备时间为5秒。\n");
        display("6.调整弹奏准备时间为6秒。\n");
        display("7.调整弹奏准备时间为7秒。\n");
        display("8.调整弹奏准备时间为8秒。\n");
        display("9.调整弹奏准备时间为9秒。\n");
        display("0.调整弹奏准备时间为10秒。\n");
        opt=getch();
        wait=opt-'0';
        if(opt=='0')
            wait=10;
    }
    return; 
}
bool inmusic(char x)
{
    if(x=='Q'||x=='W'||x=='E'||x=='R'||x=='T'||x=='Y'||x=='U'||x=='A'||x=='S'||x=='D'||x=='F'||x=='G'||x=='H'||x=='J'||x=='Z'||x=='X'||x=='C'||x=='V'||x=='B'||x=='N'||x=='M')
        return 1;
    else
        return 0;
}
void add(int x,char a)
{
    music[x].push_back(a);
}
void input(char *tmp)
{
    memset(tmp,0,sizeof tmp);
    int top=0;
    while(tmp[top-1]!='\n')
    {
        tmp[top++]=getchar();
        if(tmp[top-1]==char(-1))
        {
            ED=1;
            return;
        }
    }
    return;
}
bool read()
{
    int len;
    bool lst=1,fir;
    char ip[500];
    while(1)
    {
        input(ip);
        if(ED)
            break;
        //先大小写转化
        len=strlen(ip)-1;
        int autowa=0;
        for(int i=0;i<len;i++)
        {
            if(ip[i]>='a'&&ip[i]<='z')
                ip[i]=ip[i]-('a'-'A');
            if(ip[i]=='/')
            {
                if(i==len-1)
                    return 0;
                for(int j=i+1;j<len;j++)
                {
                    if(!isdigit(ip[j]))
                        return 0;
                    autowa=autowa*10+ip[j]-'0';
                }
            }
        }
        if(ip[0]=='\n'||ip[0]=='\r')
        {
            if(!lst)
                R[tot]=n;
            lst=1;
            continue;
        }
        else
        {
            if(lst)
            {
                tot++,n++;
                L[tot]=n;
                autowait[n]=autowa;
            }
            for(int i=0;i<len;i++)
            {
                if(ip[i]>='8'&&ip[i]<='9'||ip[i]==0)
                    return false;
                else if('1'<=ip[i]&&ip[i]<=7)
                {
                    switch(ip[i+1])
                    {
                        case '+':
                            switch(ip[i])
                            {
                                case '1':
                                    lst=0;
                                    add(n,'Q');
                                    break;
                                case '2':
                                    lst=0;
                                    add(n,'W');
                                    break;
                                case '3':
                                    lst=0;
                                    add(n,'E');
                                    break;
                                case '4':
                                    lst=0;
                                    add(n,'R');
                                    break;
                                case '5':
                                    lst=0;
                                    add(n,'T');
                                    break;
                                case '6':
                                    lst=0;
                                    add(n,'Y');
                                    break;
                                case '7':
                                    lst=0;
                                    add(n,'U');
                                    break;
                                default:
                                    return false;
                            }
                            break;
                        case '~':
                            switch(ip[i])
                            {
                                case '1':
                                    lst=0;
                                    add(n,'A');
                                    break;
                                case '2':
                                    lst=0;
                                    add(n,'S');
                                    break;
                                case '3':
                                    lst=0;
                                    add(n,'D');
                                    break;
                                case '4':
                                    lst=0;
                                    add(n,'F');
                                    break;
                                case '5':
                                    lst=0;
                                    add(n,'G');
                                    break;
                                case '6':
                                    lst=0;
                                    add(n,'H');
                                    break;
                                case '7':
                                    lst=0;
                                    add(n,'J');
                                    break;
                                default:
                                    return false;
                            }
                            break;
                        case '-':
                            switch(ip[i])
                            {
                                case '1':
                                    lst=0;
                                    add(n,'Z');
                                    break;
                                case '2':
                                    lst=0;
                                    add(n,'X');
                                    break;
                                case '3':
                                    lst=0;
                                    add(n,'C');
                                    break;
                                case '4':
                                    lst=0;
                                    add(n,'V');
                                    break;
                                case '5':
                                    lst=0;
                                    add(n,'B');
                                    break;
                                case '6':
                                    lst=0;
                                    add(n,'N');
                                    break;
                                case '7':
                                    lst=0;
                                    add(n,'M');
                                    break;
                                default:
                                    return false;
                            }
                            break;
                        default:
                            return false;
                    }
                    i++;
                }
                else if(inmusic(ip[i]))
                {
                    lst=0;
                    add(n,ip[i]);
                }
                else
                    return false;
            }
        }
    }
    return 1;
}
void Musicmenu()
{
    fir:;
    system("cls");
    display("按下任意键后经过");
    printf("%d",wait);
    display("s开始演奏。\n"); 
    getch();
    MSG msg={0}; 
    for(int i=1;i<=tot;i++)
    {
        //MOD_CONTROL
        //VK_SPACE
        while(1)
        {
            if(GetMessage(&msg,NULL,0,0)!=0)
            {
                if(msg.message==WM_HOTKEY)
                    break;
            }
        }
        for(int j=L[i];j<=R[i];j++)
        {
            for(auto v:music[j])
                play(v);
            Sleep(autowait[j]);
        }
    }
    display("演奏完毕。\n");
    display("输入数字进行选择:");
    display("1.重新演奏\n");
    display("2.退出"); 
    opt=getch();
    if(opt=='1')
        goto fir;
    else
        return;
    
}//C:\Users\Administrator\Desktop\rubia.txt
void Choosemusic()
{
    FILE * fp;
    char FilePathName[1024]={0};
    system("cls");
    display("请输入曲谱文件路径及名称。\n");
    display("说明:请输入一个形如C:\\Users\\Administrator\\Desktop\\abc.txt的文件路径及名称。\n"); 
    scanf("%s",FilePathName);
    fp=fopen(FilePathName,"r");
    if(fp==NULL)
    {
        printf("不存在这个文件\n");
        return; 
    }
    else
    {//读取数据
        freopen(FilePathName,"r",stdin);
        bool inorder=read();
        freopen("CON","r",stdin);
        if(!inorder)
            display("这份曲谱不合法。\n");
        else
            Musicmenu(); 
    }
    ED=n=tot=0;
    memset(autowait,0,sizeof autowait);
    memset(L,0,sizeof L);
    memset(R,0,sizeof R);
    memset(music,0,sizeof music);
    return;
}
void mainmenu()
{
    while(1)
    {
        system("cls");
        display("输入数字进行选择:\n");
        display("1.选择曲谱\n"); 
        display("2.设置\n");
        display("3.关于\n");
        display("4.退出\n");
        opt=getch();
        switch(opt)
        {
            case '1':
                Choosemusic();
                break;
            case '2':
                Setting();
                break;
            case '3':
                About();
                break;
            case '4':
                exit(0);
                break;
            default:
                break;
        }
    }
}
int main()
{
    if(!RegisterHotKey(NULL,1,MOD_SHIFT,0x20))//第一个参数代表热键的定义对象,NULL指线程;第二个表示热键ID;第三个代表热键配合键,此为同时按下任意Ctrl键,如果加入 | NO_REPEAT就是必须松开键再按才会有新信号,第四个是热键是什么,0x20为 SPACE 
    {
        display("热键冲突!\n");
        exit(0);
    }
    welcome();
    mainmenu();
    return 0;
} 
/*Q:
1.关于按键轻重(时长)不会影响音。 
2.关于初始化开始结束键盘 快捷键如何做到
3.关于程序模拟键入怎么办 
*/

 






本软件的代码全部有HKHbest编写,开源且遵循GPL协议。 但由于HKHbest的网速原因QWQ,目前没有在GitHub上发表,目前只会在我的博客,并在个人朋友圈和QQ空间分享相关消息。 你看到的这个版本只是一个实验版,预计未来会加入图像界面,启动弹琴的快捷键,和快速制作曲谱的相关功能。
我正在制作一个谱子和使用教程。
这个软件仍有BUG,发现请反馈给我。

使用效果视频:

链接:https://pan.baidu.com/s/1pW2QQmSO2Lgg6wZivFPhew?pwd=n5h6
提取码:n5h6

说明:开始弹奏后我没有再进行操作


手动谱:https://hkhbest.lanzouw.com/b0177cmkf
密码:f5c0

自动谱:https://hkhbest.lanzouw.com/b0177cmlg
密码:2uz3

posted @ 2022-02-01 17:20  HKHbest  阅读(238)  评论(2编辑  收藏  举报
Live2D