×

和弦Netduino音乐播放器开源分享

消耗积分:0 | 格式:zip | 大小:0.14 MB | 2022-11-08

自我清欢

分享资料个

描述

在这个项目中,您将使用 piezos 创建一个多通道音乐播放器。示例代码播放带有旋律和贝斯线的假日经典铃儿响叮当。

这个项目你只需要一个 Netduino 和两个压电,但我喜欢使用串联电阻来控制音量。您可以选择添加两个随着音乐点亮的 LED。

所有硬件都由Netduino.Foundation中的驱动程序控制,所有音乐逻辑都在 GitHub 存储库中提供。您甚至可以通过编辑 SongBook 类来添加新歌曲。

第 1 步 - 组装威廉希尔官方网站

对于这个项目,连接你的面包板和 Netduino,如 Fritzing 图中所示:

pYYBAGNom3WAELI1AAGCQYOGlnc996.png
 

 

我们将引脚 2 和 4 用于 LED,但它们可以由任何数字输出引脚驱动。

对于 Piezos,我们使用引脚 9 和 11,建议使用它们,因为它们都是启用 PWM 的引脚并且它们不共享定时器。

第 2 步 - 下载源代码

转到https://github.com/adrianstevens/NetduinoSamples并克隆或下载 repo。具体来说,我们想要XMasPlayer文件夹中的代码。

第 3 步 - 打开并探索项目

在 Windows 上的 Visual Studio 2015 或 macOS 上的 Visual Studio for Mac 中打开 XMasPlayer 项目。

首先打开App.cs,您将在此处配置硬件并播放歌曲。构造函数调用InitializePeripherals方法,这是我们设置压电和 LED 的方法。现在是确保代码中定义的引脚与我们的物理连接匹配的好时机。

我们还创建了一个PushButton对象以连接到 Netduino 的板载按钮。我们将使用它来开始播放我们的歌曲。

private void InitializePeripherals()
{
    ledMelody = new Led(N.Pins.GPIO_PIN_D4);
    ledBass = new Led(N.Pins.GPIO_PIN_D2);
    speakerMelody = new PiezoSpeaker(N.PWMChannels.PWM_PIN_D9);
    speakerBass = new PiezoSpeaker(N.PWMChannels.PWM_PIN_D11);
    buttonPlay = new PushButton(N.Pins.ONBOARD_BTN, Netduino.Foundation.CircuitTerminationType.Floating);
    buttonPlay.Clicked += OnButtonPlay;
}

接下来,查看SongBook文件夹中的代码。该文件夹有两个模型对象,一个用于音符,一个用于乐曲。我们的歌曲由一系列音符组成,一首为旋律,另一首为贝斯。如果你想要两个以上的声音,你可以扩展这个类来添加额外的音符。

SongBook 类包含一组歌曲,我们只有添加铃儿响铃的代码,但可以添加其他的。您会注意到歌曲被定义为字符串的集合,在音符和长度之间交替。然后我们在Note类中使用反射来加载正确的值。

最后,回到App类,看看PlaySong方法。这种方法循环播放所有旋律和低音音符,并将压电设置为正确的频率,并随着音乐打开和关闭 LED。

private void PlaySong(Song song)
{
   //smallest note length is a 32nd note 
   //change value to adjust tempo 
   var len32Note = 1500 / 32;
   //index of the currently playing note
   int melodyIndex = 0;
   int bassIndex = 0;
   //remaining steps for the currently playing note
   int melodyRemaining = 0;
   int bassRemaining = 0;
   //loop until we've played every melody and bass note
   while (melodyIndex < song.Melody.Length && 
           bassIndex < song.Bass.Length)
   {
       if (melodyRemaining == 0 && melodyIndex < song.Melody.Length)
       {
           speakerMelody.StopTone();
           ledMelody.IsOn = false;
           //get the length of the next note
           melodyRemaining = song.Melody[melodyIndex].Length;
           //if the note isn't silence (i.e. don't play rests)
           if (song.Melody[melodyIndex].Pitch != 0)
           {
               speakerMelody.PlayTone(song.Melody[melodyIndex].Pitch);
               ledMelody.IsOn = true;
           }
           melodyIndex++;
       }
       melodyRemaining--;
       if (bassRemaining == 0 && bassIndex < song.Bass.Length)
       {
           speakerBass.StopTone();
           ledBass.IsOn = false;
           bassRemaining = song.Bass[bassIndex].Length;
           if (song.Bass[bassIndex].Pitch != 0)
           {
               speakerBass.PlayTone(song.Bass[bassIndex].Pitch);
               ledBass.IsOn = true;
           }
           bassIndex++;    
       }
       bassRemaining--;
       Thread.Sleep(len32Note);
   }
   Thread.Sleep(len32Note * 32);
   ledMelody.IsOn = false;
   ledBass.IsOn = false;
   speakerMelody.StopTone();
   speakerBass.StopTone();
}

第 4 步 - 运行项目

单击 Visual Studio 中的运行按钮开始播放音乐!部署应用程序后,按下 Netduino 的板载按钮即可播放铃儿响叮当!

查看 Netduino.Foundation!

有很多方法可以扩展这个项目。您可以添加更多歌曲,添加更多压电扬声器,甚至添加 LED 显示屏以显示歌曲名称或音符。这很容易使用Netduino.Foundation

  • 它带有一个巨大的外设驱动程序库,其中包含市场上最常见的传感器和外设的驱动程序。
  • 所有外围驱动程序都通过内置功能进行了简化,并由干净、现代的 API 公开。
  • 这个项目得到了一个不断发展的社区的支持,该社区不断致力于构建很酷的互联事物,并且总是乐于帮助新人并讨论新项目。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'和弦Netduino音乐播放器开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);