原琴小工具
#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