【入门级程序】C语言电子琴
acmilan2015/12/23软件综合 IP:四川
这个比较简单。。。就用了一个Beep函数。。。
在DOS中发声是用sound函数,在Windows中可以用Beep函数,功能完全相同。
Beep(frequency, duration)函数可以在Windows中发出指定频率和时长的声音。
在WinXP下好像必须主板上有喇叭才能听到,在WinVista/7以后的系统中直接用声卡就行了。
<code class="lang-cpp">#include <stdio.h>
#include <conio.h>
#include <windows.h>
     
// 音符频率
int tone_map[36][2] = {
    // 按住shift
    'O', 131, ')', 139, 'P', 147, '_', 156, '{', 165, '}', 175,
    // 常规音符
    '`', 185, '\t', 196, '1', 208, 'q', 220, '2', 233, 'w', 247,
    'e', 262, '4', 278, 'r', 295, '5', 313, 't', 332, 'y', 352,
    '7', 373, 'u', 395, '8', 418, 'i', 443, '9', 469, 'o', 497,
    'p', 524, '-', 555, '[', 588, '=', 623, ']', 660, '\\', 699,
    // 按住shift
    '!', 741, 'Q', 785, '@', 832, 'W', 881, '#', 993, 'E', 988,
};
     
// 相对时值
int time_map[16][2] = {
    // 支持 1/16 1/8 1/4 1/2 1
    'z', 1, 'x', 2, 'a', 3, 'c', 4,
    's', 5, 'd', 6, 'f', 7, 'v', 8,
    'g', 9, 'h', 10, 'j', 11, 'k', 12,
    'l', 13, ';', 14, '\'', 15, 'b', 16,
};
     
int base_time = 90; // 基准时值
int cur_time = 720; // 当前时值
     
int main()
{
     
    printf("base time (recommends 90): ");
    scanf("%d", &base_time);
    printf("tones: \n"
        "   )   _       `   1   2   |"
        "   4   5       7   8   9   |"
        "   -   =       !   @   #   \n"
        " O   P   {   }  tab  q   w |"
        " e   r   t   y   u   i   o |"
        " p   [   ]   \\   Q   W   E \n"
        );
    printf("durations: \n"
        "     a   s d f   g h j k l ; '\n"
        " z x   c       v               b\n"
        );
    printf("press shift-? to quit.\n");
    cur_time = base_time * 8;
    printf("\rduration = %d     ", cur_time);
    // 按键循环
    while (int ch = getch())
    {
        if (ch == '?') return 0; // 退出
        // 查表改变时值
        for (int j = 0; j < 16; j++)
            if (time_map[j][0] == ch)
            {
                cur_time = time_map[j][1] * base_time;
                printf("\rduration = %d     ", cur_time);
                goto cont;
            }
        // 查表发声
        for (int j = 0; j < 36; j++)
            if (tone_map[j][0] == ch)
                Beep(tone_map[j][1], cur_time);
    cont:
        
    }
    return 0;
}</windows.h></conio.h></stdio.h></code>
来自:计算机科学 / 软件综合
2
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon
9年0个月前 IP:广东
801808
代码很漂亮,应该是从html里复制过来的。
论坛准备改版,届时会加入markdown,以及highlight.js之类的功能。
主板上那个是蜂鸣器。
当然,我更好奇的是这个api内部windows是怎么实现的,产生一个波形,然后调用媒体播放?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年10个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}