教调皮学生如何通过最简单的方法使用学校机房主机小喇叭弹奏简单的音乐:
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
//author: wysaid. //blog: blog.wysaid.org #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <ctype.h> int g_snd[4][7]= { 131,147,165,175,196,220,247, 262,286,330,352,393,444,494, 523,579,659,698,784,880,998, 1047,1175,1319,1397,1568,1760,1976 }; void playsnd() { puts("\n\n生日歌!\n\n"); _beep(g_snd[1][4],250); _beep(g_snd[1][4],250); _beep(g_snd[1][5],500); _beep(g_snd[1][4],500); _beep(g_snd[2][0],500); _beep(g_snd[1][6],500); _sleep(400); _beep(g_snd[1][4],250); _beep(g_snd[1][4],250); _beep(g_snd[1][5],500); _beep(g_snd[1][4],500); _beep(g_snd[2][1],500); _beep(g_snd[2][0],500); _sleep(400); _beep(g_snd[1][4],250); _beep(g_snd[1][4],250); _beep(g_snd[2][4],500); _beep(g_snd[2][2],500); _beep(g_snd[2][0],500); _beep(g_snd[1][6],500); _beep(g_snd[1][5],500); _sleep(400); _beep(g_snd[2][3],250); _beep(g_snd[2][3],250); _beep(g_snd[2][2],500); _beep(g_snd[2][0],500); _beep(g_snd[2][1],500); _beep(g_snd[2][0],500); } void play() { int c, grade = 0; bool long_snd = false; static char reflect_table[26] = {7, 18, 16, 9, 2, 10, 11, 12, -1, 13, -1, -1, 20, 19, -1, -1, 0, 3, 8, 4, 6, 17, 1, 15, 5, 14}; puts("\n进入自弹模式,按下ESC退出。使用数字键或者字符键可以弹奏音乐!\n"); puts("具体做法: 键盘字母从左往右\n(qwertyu)依次对应低音,(asdfghj)依次对应中音,\n(zxcvbnm)依次对应高音,大写字符为长音,小写为短音,请拿捏好shitf键"); puts("数字键1234567也分别对应相应的音,用数字键的话,按+或者-为调整音阶高低。按0为切换声音持续时间(长或者短)."); while((c=getch()) != 27) { if(isalpha(c)) { int snd_time = (c >= 'a') ? 250 : 500; int index = reflect_table[tolower(c) - 'a']; if(index >= 0) _beep(g_snd[index/7 + 1][index%7], snd_time); } else if(isdigit(c)) { if(c == 0) long_snd = !long_snd; else if(c <= '7') { _beep(g_snd[grade][c - '1'], long_snd ? 500 : 250); } } else if(c == '+' && grade < 4) printf("已调整音阶至 %d", ++grade); else if(c == '-' && grade >= 0) printf("已调整音阶至 %d", --grade); } } void help() { puts("音准校对程序。笔记本无机箱小喇叭的话,请打开扬声器。\n使用方式:按*可以播放示例音乐,按/可以自己尝试演奏."); puts("按+或者-为调整音阶, 按数字键为选中且播放某声音,当你听到的声音频率不对是,可以按字符键进行调整。"); puts("按字符键调整某声音频率时,上一次播放过(屏幕会有显示)的声音将被修改," "以m键为中心,小于m的字符将使音调变低,且按下越小(如a)的按键降低得越快," "大于m的字符将使音调变高,且按下越大(如z)的按键增高得越快。"); } int main() { //音准校对程序. int c; int i=0,j=0; help(); while((c=getch()) != 27) { if(isalpha(c)) { g_snd[i][j] += tolower(c) - 'm'; printf("\ni: %d, j: %d. g_snd[i][j]: %d", i, j, g_snd[i][j]); } else if(isdigit(c)) { j = (c-'0')%7; _beep(g_snd[i][j], 500); printf("\ni: %d, j: %d, g_snd[i][j]: %d", i, j,g_snd[i][j]); } else if(c == '+' && i <3) printf("音阶升高为 %d\n", ++i); else if(c == '-' && i > 0) printf("音阶降低为 %d\n", --i); else if(c == '*') { puts("演奏中,如无机箱小喇叭请打开扬声器。"); playsnd(); puts("演奏结束。"); help(); } else if(c == '/') { puts("开始测试弹奏……"); play(); puts("弹奏已退出,重新进入音准校对。"); help(); } } puts("\n校准最终结果:"); for(int x=0; x != 4; ++x) { for(int y=0; y != 7; ++y) printf("%d,", g_snd[x][y]); putchar('\n'); } while(_kbhit()) getch(); puts("请确定保存上方结果之后再按ESC关闭本窗口!\n右键复制上方内容替换掉代码中的数组g_snd"); while(getch() != 27); return 0; } |
小程序分为四个音阶,为键盘做了个映射表方便弹奏,不是许多键盘钢琴的a-z对应各个音,而是1~7,q~u,a~j,z~m按一般键盘排列分别对应各个音阶。而每个音是由略懂音律的本人亲自试音校准的,但肯定有金耳朵听着觉得不准,所以加了一段代码作为校准,具体操作可以在运行时看到提示。如果你做出了更好的校准的音阶数组,欢迎以及感谢贴上来让我修正。
点击此处下载可执行程序以及相关工程文件 部分组装机没有小喇叭可能不支持。笔记本的话一般会通过扬声器放出来。
—【学校机房党必备】如何使用台式机的主机小喇叭播放音乐? 使用本小程序,可以在学校机房(如川大江安二基楼的机房)弹奏歌曲哦!调皮的孩子必备!想当初楼主,哦不,博主我也调皮了一把,给一起上课的孩纸们丢脸了~放上代码给大家瞧瞧吧。为了方便使用,写了很多说明,这里就不赘述了,有兴趣的可以直接在这里复制源码(仅支持VC,因为以前写的时候用到_beep函数,懒得找其他环境下的替代物了)运行。
本来想放个图的,但是这破控制台程序,还是不放了。放个more标签,把你骗进来增加本文阅读量,哈哈。(我是不是太无聊了,博客又没广告什么的,阅读量什么的又是可以自己随便改的随便YY的……神马?我不是这种人?嗯,恭喜你答对了!)