打印

*俺来出题了:一道题区分你是编程老手还是菜鸟

[复制链接]
楼主: xwj
手机看帖
扫描二维码
随时随地手机跟帖
41
computer00| | 2007-12-4 16:00 | 只看该作者 回帖奖励 |倒序浏览

“让声音随着电机转”?这个是怎样个效果?

使用特权

评论回复
42
yewuyi| | 2007-12-4 16:19 | 只看该作者

~~,随着电机转就是咯吱咯吱的响了罢……

呵呵,还是没看懂这个调,那个调……


忽忽,我是乐盲,基本对音乐的各个知识是一无所知。


能不能弄个乐谱实际演练一下给大家看看?!

使用特权

评论回复
43
fsaok| | 2007-12-4 16:34 | 只看该作者

6221的编码太长了

建议用9148

使用特权

评论回复
44
xwj|  楼主 | 2007-12-4 16:40 | 只看该作者

呵呵,“让声音随着电机转”那就是噪音了:-)

而且声音的频率比电机高很多哦,比如440Hz,对应转速就是二万六千四百转/分的转速,哪个电机有这么快啊?

使用特权

评论回复
45
chuangong| | 2007-12-4 20:43 | 只看该作者

我一直都用这种思路编程,

把timer看着是一个时基,(其实大部分MCU也就是一个总时基--晶震)

其他实时性和“频率精度”要求不高的如按键,显示扫描等可以主循环查询时基执行。
红外,电机或者其他对“频率精度”要求比较高的可以放到timer中断,在中断中也要注意分配,尽量避免一次中断中执行的任务大于1;

我平时就这样做过多个项目了。

对于有些惯用delay()的新人,应该多些思考一下这道题了。否则要实现按键不影响动态显示都有困难了。

使用特权

评论回复
46
eraychen| | 2007-12-4 21:04 | 只看该作者

旺帖,顶顶

使用特权

评论回复
47
uc.c| | 2007-12-4 22:09 | 只看该作者

关注下这个贴子。。

使用特权

评论回复
48
兰天白云| | 2007-12-4 22:26 | 只看该作者

用3元的16C54做,好,不错

使用特权

评论回复
49
zhuhai2004| | 2007-12-5 09:12 | 只看该作者

我的想法.

1、487us一次中断->487us->7.8ms->15.6ms->0.5s
2、487us中断服务程序:判断红外接收(1.53ms/2.56ms需要判断处理,用一堆的switch/case进行处理,程序空间换来执行速度。);驱动蜂鸣器(频率只能改2k-1khz-500....不知道是否有更好的办法.)
3、主程序5ms扫描显示。
4、主程序15.6ms扫描按键。
5、电机没有搞过。
上述没有实践证明,只属于描述。我想如果用51的片子估计跑不赢。

使用特权

评论回复
50
dcp| | 2007-12-5 09:32 | 只看该作者

PIC16C54定时器是可以扩展成软定时中断的,

软定时中断效果和硬定时中断效果一样,只是使用方法不同

使用特权

评论回复
51
yewuyi| | 2007-12-5 09:40 | 只看该作者

同意LS说法……

如果这点小技巧都搞不定,俺估计他也肯定搞不定这道题了……

使用特权

评论回复
52
qjc.j| | 2007-12-5 09:59 | 只看该作者

430

timerA
PWM输出
捕获
定时
做这个应该没有什么问题吧

使用特权

评论回复
53
sz_kd| | 2007-12-5 10:20 | 只看该作者

看怎么选美的

使用特权

评论回复
54
computer00| | 2007-12-5 10:33 | 只看该作者

回44楼,弄个简单的先给你试试,例如小星星一段

1 1 5 5 6 6 5    4 4 3 3 2 2 1
--- --- ---      --- --- ---

我们取C调,通过计算,1对应的频率为523Hz,2对应的频率为587Hz,3对应的频率为659Hz,
4对应的频率为698Hz,5对应的频率为784Hz,6对应的频率为880Hz。

加了一根下划线的每个音我们可以取0.5秒,没加的取1秒。然后按照这个播放就OK了。
为了区分一个个音符,我们需要在每个音符完之前稍微停顿(即不发声)片刻,不然听起来就是一片了。


要弄得好听些,还可以用一些简单的硬件电路产生包络,可以获得一些不同的音色。

使用特权

评论回复
55
dld2| | 2007-12-5 10:44 | 只看该作者

呵呵,原来音乐是这麽搞出来的

如果做得考究,是不是每个音符应该逐渐衰减?

使用特权

评论回复
56
yewuyi| | 2007-12-5 11:07 | 只看该作者

~~,还是不懂

computer00 发表于 2007-12-4 14:51 侃单片机 ←返回版面    
40楼: 呵呵,产生音乐也比较简单 
标准的A音是440Hz。低一个八度就是频率降低一半,高一个八度就是频率升高一倍。把一个八度按照指数关系分成12等份,每一等份就是一个小二度(或者叫一个半音)。两等份就是一个大二度(或者叫一个全音)。这样就可以将各个音的频率算出来了。然后可以随便取一个当作1(这里我们暂时不管什么调啦),再升高一个全音就是2,注意3和4之间、7和1之间是半音,其它两个之间都是全音,按照这个关系,就可以将7个自然音阶定出来了。然后随便找个歌谱就可以按照这个来编程了。

如果需要按照原调来写的话,只需要选择不同的主音就行了,例如A大调,就选择A作为1,A小调,就选择A作为6。绝对音高用ABCDEFG这7个字母表示,B和C,E和F之间是半音,其它之间是全音。这样全音之间就还有个半音,例如C和D之间,C升高一个半音,可以用#C表示。

computer00 发表于 2007-12-5 10:33 侃单片机 ←返回版面    
56楼: 回44楼,弄个简单的先给你试试,例如小星星一段 
1 1 5 5 6 6 5    4 4 3 3 2 2 1
--- --- ---      --- --- ---
我们取C调,通过计算,1对应的频率为523Hz,2对应的频率为587Hz,3对应的频率为659Hz,4对应的频率为698Hz,5对应的频率为784Hz,6对应的频率为880Hz。
加了一根下划线的每个音我们可以取0.5秒,没加的取1秒。然后按照这个播放就OK了。
为了区分一个个音符,我们需要在每个音符完之前稍微停顿(即不发声)片刻,不然听起来就是一片了。
要弄得好听些,还可以用一些简单的硬件电路产生包络,可以获得一些不同的音色。
 
 
问题:
Q1:“1对应的频率为523Hz,2对应的频率为587Hz,3对应的频率为659Hz,4对应的频率为698Hz,5对应的频率为784Hz,6对应的频率为880Hz。 ”
这是怎么计算出来的,是不是还有个7对应的频率 ?
Q2:为什么取C调,为什么不取A调或者X调?呵呵,一共有多少个调?想取什么调就取什么吗?
Q3:“加了一根下划线的每个音我们可以取0.5秒,没加的取1秒。然后按照这个播放就OK了”
那个下划线是谁加上的?是原来的乐谱里面就有还是要我们自己来加?加线的取0.5S是不是持续输出当前音符1~7的频率0.5S的意思?
Q4:“为了区分一个个音符,我们需要在每个音符完之前稍微停顿(即不发声)片刻,不然听起来就是一片了。”
稍微停顿片刻一般指多长时间?自己想停多少时间自己定吗?只要听起来感觉好就行?还是乐谱自己确定了这稍微停顿的时间是多少?
Q5:A音指什么东西?
    7个自然音阶指什么东西?是这个:多/冉/密/伐/梢/拉/熙 ?
Q6:“例如A大调,就选择A作为1,A小调,就选择A作为6”
    这句能不能再解释一下?

使用特权

评论回复
57
computer00| | 2007-12-5 13:18 | 只看该作者

呵呵,先来回答一下57楼d1d2的问题

的确是要对每个音符做逐渐衰减处理(专业术语叫做释放),不过直接用MCU的IO做来完成,
我们就可以简化些,直接停止就行了。以前看到过一个电路,利用电容的放电曲线来产生逐
渐衰减的余音效果。音色主要由它的包络和谐波成分决定。在这里我们不好控制谐波,控制
包络还是可以的。一个音的包络主要由4个阶段决定:上冲,衰退,保持,释放,英文简写
为ADSR。使用RC电路的输出电压,通过控制充电时间常数和放电时间常数(通过IO口选择不
同的电阻),在一定程度上能够获取到不同的音色。例如钢琴音色就是上冲短而快,而释放比较缓慢。



接下来是yewuyi的几个问题:

A1: 这是根据12平均律计算出来的。由于人耳对声音频率的响应是对数关系,所以我们将
一个八度(例如440Hz到880Hz)按照指数关系平均分成12等份,这样刚好跟人耳的对数关系
相补偿,结果让人听起来感觉就是平均分配的。我们用分别用符号来表示这12个音,例如
A #A B C #C D #D E F #F G #G,这些记号叫做绝对音高。每两个记号之间相差的频率距离
叫做一个半音,两个半音合起来就是一个全音。其中B和C,E和F之间是半音,其它不带#(升
记号)的两个之间相差一个全音。这样,任意两个为倍频关系的音之间都可以分为12等份。
而我们规定,标准的A音频率为440Hz。当然,在220Hz到440Hz之间也存在着这12个音,也是
用这样的记号,不过就是低了一个八度,相应的,还有高八度的等等。在钢琴上,用大小写
字母以及配合数字来标记这些音。在钢琴上的白键,就是那些没有#的,而黑键,就是带#的
那些。具体的频率计算公式如下:升高一个半音就是在前一个音的基础上加上2的十二分之一次方,
例如A音频率为440Hz,那么#A音的频率就是440+440*2^(1/12)。


A2: 取C调是我举个例子而已。一个曲子是什么调,在作曲的时候就指定了。当然,为了适合
演奏或者演唱,可以换成其它的调子。例如像我们做的这个,选择一个合适频率的范围,既能
让蜂鸣器比较好的发声,又能让MCU不要太累,这样决定之后,再根据曲子的音符范围,就可以
选择一个合适的调了。你看,总共有12个符号,那么就应该有12种大调和12种小调了。


A3:音符长短是曲谱里面定义好的,是作曲者觉得这样好听就这样定了。通常,在简谱里面,
不加任何修饰的就是一个四分音符,下面加一个下划线就表示八分音符,加两个下划线就表示
十六分音符,依次类推。每多一个下划线,时值要减半。加一个下划线的0.5s就表示这个音符
要连续发声0.5s,这样一个四分音符就是一秒。如果以四分音符为一拍的话,就是60拍每分了。


A4:这个主要是因为我们的MCU不能让它产生包络,所以用停顿片刻来区分下一个音的开始。
这个参考一下对d1d2的回答。自己感觉得差不多就行了吧。实际中是没有这个值的,由乐器
本身的特性来决定。当然,实际乐曲中可能有休止符,那个就是真正的停止发声了,并且有长度规定。


A5:A音是一个绝对音高的符号,我们规定了它的频率,然后其它音的频率是根据它的值算出来的。
7个自然音阶就是指do re mi fa so la si,简谱就是用数字1~7来表示。我们规定3和4,7和1之间
是半音,其它几个之间是全音。夹在自然音阶中间的叫做变化音阶,例如#1,#2等。如果按照这个关系,
我们选择C作为1,那么我们发现刚好是有#的对应着#,没#的对应着没#的,即7个自然音阶刚好对应
着钢琴上的全部白键。而大调的曲子以1为主音,这就是为什么我们看到大部分曲子是C大调的原因。
另外如果是G大调的话,只有一个#F,这也是G大调比较常用的原因。


A6:曲子根据要表现的感**

使用特权

评论回复
58
dld2| | 2007-12-5 13:28 | 只看该作者

谢了。收藏!

使用特权

评论回复
59
dld2| | 2007-12-5 13:39 | 只看该作者

看完了,学习了基本音乐知识,再顶!

圈圈和匠人都“近妖”。

使用特权

评论回复
60
hbicecream| | 2007-12-5 13:40 | 只看该作者

靠,谁说不能用OS

谁说不能用OS我跟他急,我找个300M主频的CPU,OS时钟节拍不到1uS,哈哈!!!

严重鄙视动不动就OS的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则