无忧启动论坛

 找回密码
 注册
搜索

想做一个这样的程序,哪一种程序语言比较容易实现的?

查看数: 9246 | 评论数: 44 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-7-3 19:46

正文摘要:

本帖最后由 bjay2008xmy 于 2021-7-8 11:55 编辑

回复

bjay2008xmy 发表于 2021-7-6 18:57:04
提示: 作者被禁止或删除 内容自动屏蔽
plusv 发表于 2021-7-6 17:05:37
bjay2008xmy 发表于 2021-7-6 16:52
单片机怎么还跟音律扯上了呢?

因为 单片机 也可以让 蜂鸣器 发声,
以前是 8048/51 ...
现在是 Arduino/Raspberry Pi ...

点评

这么单调的音色,也就是装在玩具上面  详情 回复 发表于 2021-7-6 18:57
bjay2008xmy 发表于 2021-7-6 16:52:31
提示: 作者被禁止或删除 内容自动屏蔽
junyee 发表于 2021-7-6 15:45:24
9zhmke 发表于 2021-7-6 15:08
是呀,你也玩这个?

单片机玩了七八年。
从早期的 51,stm8,stm32 和一大堆的 cortex-mX 都玩了个遍。
pic/msp430,esp 这些也都玩

挺费钱的。...

点评

单片机怎么还跟音律扯上了呢?  详情 回复 发表于 2021-7-6 16:52
9zhmke 发表于 2021-7-6 15:08:42

是呀,你也玩这个?

点评

单片机玩了七八年。 从早期的 51,stm8,stm32 和一大堆的 cortex-mX 都玩了个遍。 pic/msp430,esp 这些也都玩 挺费钱的。...  详情 回复 发表于 2021-7-6 15:45
bjay2008xmy 发表于 2021-7-6 14:53:27
提示: 作者被禁止或删除 内容自动屏蔽
plusv 发表于 2021-7-6 09:54:29
bjay2008xmy 发表于 2021-7-6 09:34
我在delphi7编译你的这个程序,编译通过了,右键点击按钮输出文本的功能没有反应。查过一些相关资料,好 ...

我上传的是 Delphi 7 完整源码 + 已编译后的 .EXE 没问题.

点评

源码没问题,是我的问题。 原来按钮还有一个OnMouseDown属性  详情 回复 发表于 2021-7-6 14:53
junyee 发表于 2021-7-6 09:53:30
9zhmke 发表于 2021-7-5 22:46
可以简化为只记最基本的频率,高几个8度和低8度都用算法:
int music_array[8]={0,262,293,329,349,392,44 ...

  arduino 吧。

点评

是呀,你也玩这个?  详情 回复 发表于 2021-7-6 15:08
bjay2008xmy 发表于 2021-7-6 09:34:18
提示: 作者被禁止或删除 内容自动屏蔽
nttwqz 发表于 2021-7-5 23:08:23
bjay2008xmy 发表于 2021-7-5 22:45
程序很小巧实用,费心了。

这两天我去学习了一些面向对象的程序设计,也能自己做了一个程序出来了。 ...

还是自己写的更符合自己的心意,就是吧复杂的总是懒的去弄。。。
9zhmke 发表于 2021-7-5 22:46:20
可以简化为只记最基本的频率,高几个8度和低8度都用算法:
int music_array[8]={0,262,293,329,349,392,440,494};//基准音频率,第一个除开数组从0开始以便对应1-7的音

我多年前写的单片机激光琴程序代码片段:

  1. void Read_Laser(){//读竖横光柱以分析演奏者意图,play[i]的[0]是当前光柱值,[1-10]最后10次,11方向判断,12峰值位置,13峰值,14谷值位置,15谷值。程序段运行40毫秒左右,约30次/秒
  2.     //starttime = millis();
  3.     natural=analogRead(54);//54(A0)-正常无激光光柱时的环境光读数,无遮栏光值,暂时没想到用来做什么
  4.     play[i][13]=0;play[i][15]=0;//本轮演奏最小值、最大值
  5.     for(i=1;i<8;i++) {  //为便于理解,使用1-7而不是0-6
  6.         play[i][11]=0;   //这个位置是累计增加次数用来判断方向,10都向同一方向则为10,都为相反为-10,否则为其他数
  7.         tmp=analogRead(i+54);//55-61(A1-A7)竖光柱,//下面第3句读出8度到变量octave,默认优先最高音,因为下方有可能是衣袖挡住
  8.         play_current=(abs(tmp<300)*(300-tmp)+tmp-abs(tmp>681)*(tmp-681)-300)/3;//用0-127表达手挡的多少,低于300算300,高于681算681,381除以3刚好映射为0-127
  9.         octave=0;if (digitalRead(3)==HIGH) octave=1;if (digitalRead(4)==HIGH) octave=2;if (digitalRead(5)==HIGH) octave=3;if (digitalRead(6)==HIGH) octave=4;
  10.         if(test>0) {//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<测试才有
  11.           if(random(0,101)>0) octave=octave_last; else octave= random(0,5);//100分之1的机率产生随机数,100分之99与上次相同的8度
  12.         }
  13.         for(j=7;j>0;j--) {             //记录下光柱变化,并保存到数组中,数组记录最后10次的值,此处的循环用于移动变量形成队列
  14.             tmp=play[i][j]-play[i][j-1];//得出两数值之差,用于下一句的判断
  15.             play[i][11]=play[i][11]+(tmp>0)-(tmp<0);//如果前面一个值比后面一个值大,则tmp为1,相同为0,较小为-1
  16.             play[i][j]=play[i][j-1];//变量后移形成队列
  17.         }
  18.         if(play_current<play[i][13]) {play[i][12]=0;play[i][13]=play_current;} else play[i][12]++ ;//峰值随数组变动位置
  19.         if(play_current>play[i][15]) {play[i][14]=0;play[i][15]=play_current;} else play[i][14]++ ;//谷值随数组变动位置
  20.         play[i][0]=play_current;//55-61(A1-A7)竖光柱,54(A0)-环境光只在开机和适当的时候再读取,放入play[0][0]
  21.         play_wave=play[i][14]-play[i][12];//峰值到谷值的频率为抖动频率
  22.         //play_size=play[i][15]-play[i][13];//峰值到谷值的幅度为抖动幅度
  23.         channel=36+octave*12+i*2-2-(i>3);//把第几根光柱和八度换算成12度音阶数值代码以便后续调用
  24.         for(tmp=1;i<7;i++) if (play[tmp][1]>play_size) play_size=play[tmp][1];//最后几个数中的的最大值
  25.         play_size=play_size*3;if(play_size>126) play_size=127;//音量最大只能127
  26.         if (play_current<1)   //-----------------------------------------满激光,表示手伸出去了,没有手掌或手指挡住-------------------------------------
  27.             if (play[i][1]==0)  for(j=15;j>0;j--) play[i][j]=0;//上次就已经是0 则消除所有记录重新来
  28.             else{
  29.                 if (channel>35) {//有发声标志则发声,参数为光柱、8度、轻重、弯音<<<<<<<<<<<<<<唯一的发声入口
  30.                       mySerial.write(144);mySerial.write(channel);mySerial.write(play_size);
  31.                 }
  32.             }
  33.         else   {             //-----------------------------------------激光被阻挡,表示手伸进来了-------------------------------------
  34.             //if(play[i][11]== 10);//10个变量都渐变增大此为入
  35.             if(play[i][11]=7) {//最后7次都是向里面伸手,应该压低声音
  36.                 mySerial.write(128);mySerial.write(channel);mySerial.write(play_size);
  37.             }
  38.             else {//手已进来,但在抖动,应产生颤音
  39.                 //升半音或者降半音
  40.                 //跟随手指的抖动频率来升降半音
  41.             }
  42.         }
  43.         octave_last=octave;
  44.     } //Serial.print("Read_Laser: ");Serial.println(millis() - starttime);   delay(1000);//计算执行一次的时间
  45. }

复制代码

点评

arduino 吧。  详情 回复 发表于 2021-7-6 09:53
bjay2008xmy 发表于 2021-7-5 22:45:13
提示: 作者被禁止或删除 内容自动屏蔽
nttwqz 发表于 2021-7-5 21:45:41
重新编译了一下,现在支持大约8190个字符,也就是相当于五六百个音符,相比足够你用了。

音符频率转换.7z (52.6 KB, 下载次数: 3)

点评

程序很小巧实用,费心了。 这两天我去学习了一些面向对象的程序设计,也能自己做了一个程序出来了。 我不是想用它来编什么曲子,是想学习一些提高效率的方法  详情 回复 发表于 2021-7-5 22:45
bjay2008xmy 发表于 2021-7-5 21:37:02
提示: 作者被禁止或删除 内容自动屏蔽
bjay2008xmy 发表于 2021-7-5 21:09:35
提示: 作者被禁止或删除 内容自动屏蔽
junyee 发表于 2021-7-5 19:58:19
楼主这个要求,用 html + javascrip , 用浏览器开 F12 调试会比较简单。
junyee 发表于 2021-7-5 19:57:37
bjay2008xmy 发表于 2021-7-3 22:50
你说的有理,要想随心写出符合自己要求的批处理应该先打好基本功,这样就不用再处处求人了。我接触批处理 ...

批处理我从04年接触的,学得好也不敢说。
100分考个8~90 该是有的。

学习不要太苛求悟性,这玩意可不是人人都有。
但肯多花些时间勤练,是能看到效果的。

学习的初期是茫然的,尤其是面对复杂的语法,看到 几十个关键字,几十几百个标准函数,数不清的API函数,更别提各种语言有些莫名其妙的语法糖了。

学学批处理,bash 这类脚本,反倒能在短时间得到成就感,激发起学习兴趣。



plusv 发表于 2021-7-5 18:19:47
bjay2008xmy 发表于 2021-7-4 17:33
plusv ,你这个delphi程序的261.6256按钮和自订时长按钮的代码能分享一下吗?因为本人确实不通delphi,程 ...




Demo.rar

160.93 KB, 下载次数: 1, 下载积分: 无忧币 -2

bjay2008xmy 发表于 2021-7-4 21:42:47
提示: 作者被禁止或删除 内容自动屏蔽
nttwqz 发表于 2021-7-4 21:16:37
我也写个玩玩吧,用NSIS实现。





音符频率转换.7z (52.59 KB, 下载次数: 2)
bjay2008xmy 发表于 2021-7-4 17:33:25
提示: 作者被禁止或删除 内容自动屏蔽
nttwqz 发表于 2021-7-4 14:03:10
bjay2008xmy 发表于 2021-7-4 11:45
个人的兴趣爱好罢了,喜欢什么就去研究什么,干嘛要去争辩呢?

世界之大,不可能指望一道菜每个人都爱吃。论坛本身就是交流和争论之地,只有这样才会有新的发现,天下观点都一样,你永远接触不到新东西。
他的观点基于从前到现在这个前提,说的是旧知识一部分同样适用于新知识,就比如DOS学好了肯定批处理就更好学了。又假设以前有龙,有人精通屠龙,他熟悉熟悉照样可以杀猪。
而我的观点以现在到从前为前提,拿杀猪来说,难道学杀猪得从屠龙术学起,等精通了屠龙术再熟悉龙和猪的区别,这样杀猪就好学了,那何不直接学杀猪?
前提的不同造成了不一样的观点,基于各自的前提,观点均正确。
bjay2008xmy 发表于 2021-7-4 11:45:36
提示: 作者被禁止或删除 内容自动屏蔽
bjay2008xmy 发表于 2021-7-4 11:44:34
提示: 作者被禁止或删除 内容自动屏蔽
bjay2008xmy 发表于 2021-7-4 11:27:32
提示: 作者被禁止或删除 内容自动屏蔽

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-12 11:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表