极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10110|回复: 0

做了个入门级的电子琴

[复制链接]
发表于 2014-2-7 15:40:51 | 显示全部楼层 |阅读模式
13接可变电阻接峰鸣器
3456789分别接常开开关接地

int soundport=13;
//13接峰鸣器
int hl=1;
//初始为中间调
int soundkey[]={3,4,5,6,7,8,9};
//CDEFGAB七个键位接的口

void setup() {
  //Serial.begin(9600);
  pinMode(soundport,OUTPUT);
  for(int i=0;i<=6;i++){
    pinMode(soundkey[i],INPUT);
    digitalWrite(soundkey[i],HIGH);
    //使用内置的上拉口
  }
}

int yfl[]={262,293,329,349,392,440,494};
int yf[]={523,586,658,697,783,879,987};
int yfh[]={1045,1171,1316,1393,1563,1755,1971};
//三个段的tone的参数,可以改用一个二维数组,此时下面的ps()也要改

void ps(int fre){
  if(hl==0){
    tone(soundport,yfl[fre]);
  }else if(hl==1){
    tone(soundport,yf[fre]);
  }else if(hl==2){
    tone(soundport,yfh[fre]);
  }
}

void loop() {
  boolean anykeypress=false;
  //anykeypress为标记flag变量,记录是否有键按下
  for(int i=0;i<=6;i++){
    if (digitalRead(soundkey[i])==0){
      ps(soundkey[i]-3);
      anykeypress=true;
    }
  }
  //扫描soundkey[]中的所有端口,如有按下(低电平),则发音
  if (!(anykeypress)){
    noTone(soundport);
  }
  //如果当前没有键按下,则关闭峰鸣器
}



做了个测试,loop里仅有 ps(1);ps(2);,按道理有的琴应该发一个和声,但是这里就完全不是那样,难道是要根据523和586计算出一个值来让tone发声么?如果同时按多个键呢?(手头没有电子琴,不记得应该是咋样的了。)
回复

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-10 00:39 , Processed in 0.050379 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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