无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
12
返回列表 发新帖
楼主: bjay2008xmy
打印 上一主题 下一主题

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

[复制链接]
31#
 楼主| 发表于 2021-7-5 21:37:02 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

32#
发表于 2021-7-5 21:45:41 | 只看该作者
重新编译了一下,现在支持大约8190个字符,也就是相当于五六百个音符,相比足够你用了。

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

点评

程序很小巧实用,费心了。 这两天我去学习了一些面向对象的程序设计,也能自己做了一个程序出来了。 我不是想用它来编什么曲子,是想学习一些提高效率的方法  详情 回复 发表于 2021-7-5 22:45
回复

使用道具 举报

33#
 楼主| 发表于 2021-7-5 22:45:13 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

34#
发表于 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
回复

使用道具 举报

35#
发表于 2021-7-5 23:08:23 | 只看该作者
bjay2008xmy 发表于 2021-7-5 22:45
程序很小巧实用,费心了。

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

还是自己写的更符合自己的心意,就是吧复杂的总是懒的去弄。。。
回复

使用道具 举报

36#
 楼主| 发表于 2021-7-6 09:34:18 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

37#
发表于 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
回复

使用道具 举报

38#
发表于 2021-7-6 09:54:29 | 只看该作者
bjay2008xmy 发表于 2021-7-6 09:34
我在delphi7编译你的这个程序,编译通过了,右键点击按钮输出文本的功能没有反应。查过一些相关资料,好 ...

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

点评

源码没问题,是我的问题。 原来按钮还有一个OnMouseDown属性  详情 回复 发表于 2021-7-6 14:53
回复

使用道具 举报

39#
 楼主| 发表于 2021-7-6 14:53:27 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

40#
发表于 2021-7-6 15:08:42 | 只看该作者

是呀,你也玩这个?

点评

单片机玩了七八年。 从早期的 51,stm8,stm32 和一大堆的 cortex-mX 都玩了个遍。 pic/msp430,esp 这些也都玩 挺费钱的。...  详情 回复 发表于 2021-7-6 15:45
回复

使用道具 举报

41#
发表于 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
回复

使用道具 举报

42#
 楼主| 发表于 2021-7-6 16:52:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

43#
发表于 2021-7-6 17:05:37 | 只看该作者
bjay2008xmy 发表于 2021-7-6 16:52
单片机怎么还跟音律扯上了呢?

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

点评

这么单调的音色,也就是装在玩具上面  详情 回复 发表于 2021-7-6 18:57
回复

使用道具 举报

44#
 楼主| 发表于 2021-7-6 18:57:04 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-16 15:30

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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