65.9K
CodeProject 正在变化。 阅读更多。
Home

SoloGig v1.0 for Windows and Win 8.1 Tablets (not WinRT)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2015年3月21日

CPOL

9分钟阅读

viewsIcon

13702

downloadIcon

238

一个小型实用应用程序,使用优秀的NAudio库来帮助组织伴奏音轨(用于乐队“减一”场景的音频文件)、和弦/乐谱、歌词等。适用于运行完整版Windows 8.1的Windows平板电脑。

引言

我想以我父亲鼓励我帮助他人的话作为本文的开篇。所以,爸爸,以我自己的方式,为纪念2015年春天的开始以及您本该迎来的88岁生日,这篇文章献给您!您教导有方,愿您安息!

本文简要介绍了SoloGig的使用方法及其起源。源代码和Visual Studio 2013解决方案可从上面的下载链接获取。

我花费了许多时间寻找一个“带有歌词的简单媒体播放工具”类型的程序,适用于任何移动设备。虽然我确实找到了一些尚可接受的程序,但没有一个免费,也没有一个能以我期望的“现场”使用方式运行。因此,我决定自己编写一个,并免费赠送这个程序,而不是继续在网上搜索。

我希望那些使用该应用程序的人能像我一样发现它在“现场演奏”场景中很有用。喜欢摆弄代码的人也可以随意修改。如果需要,请随时添加或建议更多功能。我想声明,我绝不是NAudio专家,也不是C#大师,所以可能存在更好的方法来处理媒体结束事件、自定义控件等。但是,为了让自定义列表框能够突出显示选定项和当前播放项,我不得不“粘合”了一个“创意”的事件触发系统。换句话说,从专业角度来看,代码可能很难看!

背景

SoloGig是我编写的一个小型Windows程序,旨在解决在一个方便访问的用户界面中,集中管理用于演奏小型“独奏”式演出的所有相关文件(例如咖啡馆、酒吧二重奏、后院派对等)的问题。考虑到能够运行完整版Windows 8.1的平板电脑价格最近有所下降,我的目标是编写我的第一个“移动”应用程序,这样我就可以随身携带SoloGig,而无需单独的伴奏音轨播放系统或文件夹里的打印乐谱和/或歌词等。

我在我的Windows 7 x64开发服务器、一台Dell Venue 8英寸平板电脑和一台Acer Aspire Switch 10英寸平板电脑上进行了测试,结果非常出色。这些平板电脑都运行完整版Windows 8.1。使用Windows RT的平板电脑将无法运行此应用程序。

原本只是一个简单的C#练习,很快我就发现了某些内置.NET控件的不足。与其冗长地抱怨所有者绘制控件与复合控件的区别,我将决定权留给读者,让他们自己决定是只想使用这个程序,还是想探索其中的哪些功能,如果你像我一样,认为“玩”Visual Studio是一种放松的活动。这里没有什么特别花哨的东西。一个带有三种绘制模式的自定义圆形按钮,一个带有自定义绘制的拖放列表框,以及一个用于媒体音量和媒体播放位置的自定义滑块控件。尽管该应用程序是一个“普通的WinForms” .NET应用程序,但我不想让它看起来像一个,至少,主界面不想。

虽然我喜欢.NET,但它在“有用”的媒体技术方面支持不足,包括不同格式的压缩音频播放、近乎实时的(低延迟)音频设备、MIDI等。Enter NAudio。NAudio库(链接如下)解决了我的应用程序面临的所有问题。鉴于NAudio非常出色且免费,我想亲自感谢Mark Heath付出的所有努力。

使用应用程序

请参考本文顶部的截图以及以下说明,或者直接在您的桌面上运行该应用程序。

SoloGig被设计为直观且对触摸屏友好。您首先通过单击圆形的(+)按钮将媒体文件添加到曲目列表中。单击此添加项目按钮将打开以下对话框。

输入歌曲标题,然后浏览您想为当前歌曲使用的文件。

如果您想从曲目列表中删除一个条目,只需单击列表视图(listview)中的项目进行高亮显示,然后单击(-)按钮。

注意:您可以通过拖放来重新排列曲目列表的顺序,但当曲目列表变得很长时,在触摸屏上可能会变得困难。

一旦您将几个媒体文件收集到曲目列表中,您可能希望保存该曲目列表以供将来使用。您可以通过单击带有指向磁盘的红色箭头的“旧软盘”图标来完成此操作。输入文件名并单击“保存”。在截图中的此图标是灰色的,因为有一首歌曲正在播放。在媒体项目播放时,不允许修改或保存曲目列表,或更改音频设备配置。

通过另一个软盘按钮(带有指向磁盘外的绿色箭头,在截图中也呈灰色)可以加载已保存的曲目列表。

添加项目按钮正下方的按钮是用于配置。这允许您选择一个音频设备进行播放。请注意!我曾遇到使用各种ASIO设备的几个问题!

不要等到演出当晚才测试您的ASIO设备是否正常工作!有些设备可能会导致崩溃。有些设备存在重置问题(根据现有代码库)。此应用程序的下一个版本将尽可能解决这些缺陷。我给您的最好建议是在“上线”之前,对您的整个曲目列表进行一次试运行。

看起来像小平板电脑的按钮可以改变主窗口的显示方向,并最大化或恢复主窗口的正常大小。我特意选择忽略自动方向,因为能够选择自己舒适的模式比强制您使用根据设备物理方向选择的模式更有益。只需单击此按钮几次即可循环浏览四种不同的模式。

纸片按钮可以切换显示和弦乐谱或歌词乐谱。有些人喜欢分开显示。我喜欢将它们都放在一个地方(如截图所示)。和弦和歌词只是文本文件。我更喜欢使用RTF(富文本格式)文件,以便对显示格式有更多控制。

您可以通过轻触/单击文本区域来更改文本显示的缩放系数。在Windows 8.1平板电脑上,您还可以通过捏合进行缩放!内置于控件中!.NET万岁!在添加项目对话框中构建曲目列表时设置默认缩放系数,有助于适应那些难以阅读的文件以及正常的缩放级别。

只需单击曲目列表中的一首歌曲,然后单击传输控件附近的播放按钮(|>)。

列表视图(listview)中的绿色高亮显示当前正在播放的歌曲。列表视图(listview)中的紫色高亮显示当前在文本窗口中显示的歌曲。您可能需要根据当前播放的媒体类型(器乐等)进行跳转。具有两个高亮显示以及拖放重新排序功能很有帮助,因此需要自定义控件。

基本上SoloGig就是这样!希望您觉得有用!

享受吧!

我强烈鼓励您打开Visual Studio,开始深入研究项目源代码。我敢肯定您能想到改进应用程序的方法!稍微深入研究一下,您就会发现这很简单!

使用或扩展代码

代码包含两个类来处理曲目列表管理:SetList.csSetListEntry.cs。如果您想为每首歌曲添加额外信息,例如位图艺术作品或任何您能想象到的内容,请从这里开始。SetList类只是SetListEntry对象的集合。SetList类用于在运行时填充SetList List View。记住编辑SetListEntryEditor窗体来处理与数据存储类之间所有数据的输入和输出。

您可能唯一想要甚至需要更改(或者添加到配置UI)的是与默认音频设备缓冲区大小和延迟相关的部分。它存在于NAudioPlayer.cs 辅助函数中,如下所示:

#region Local Private helper Functions

private void CreateWaveOut()
{
    CloseWaveOut();

    // set default latency quite high to avoid glitches on tablets, slow systems, etc.
    int latency = 300;              

    m_WavePlayer = SelectedOutputDevicePlugin.CreateDevice(latency);
    m_WavePlayer.PlaybackStopped += OnPlaybackStopped;
    m_AudioDeviceReady = true;

}
.
.
.

对于我的所有设备来说,300的延迟值都可以正常工作。实际上这并不重要,因为这里没有任何时间敏感的同步,除了您的耳朵。也就是说,如果您的音频设备容易出问题,您可能想增加这个值,但代价是应用程序相对于位置跟踪、音量变化等会增加额外的延迟。

我想添加的功能

市面上有几款蓝牙设备,它们设计用于通过脚踏开关控制媒体播放。还有一些设备设计用于“翻页”,就像翻阅实际的印刷乐谱一样。我想在下一版本的Solo Gig中添加此功能。我推测这些设备是以某种USB输入设备的形式出现的,但我真的不确定。我还没有买到任何一个。

此外,我还希望能够让媒体项目无缝循环播放,并无缝过渡到曲目列表中的下一个媒体项目。目前,在尝试这两种操作时都有明显的音频间隙。这可能需要对音频流进行更底层的控制。如果有人能就如何实现这一点提供一些好的建议,我将非常乐意学习!

关注点

NAudio是.NET下进行媒体处理的优秀库。

我只使用了这个出色的免费库的一小部分功能。在此项目解决方案中,我包含了一些NAudio的窗体控件源代码,以便能够自定义音频设备选择对话框的图形方面。NAudio源代码的轻微修改版本都位于Visual Studio解决方案中的NAudioHelperClasses文件夹中。

如果您想编写.NET音频应用程序,我鼓励您探索整个NAudio项目。

http://naudio.codeplex.com/

已知问题

在音频播放时更改NAudio中的音频设备通常是非常糟糕的事情!SoloGig用户界面阻止您这样做。如果您打算修改代码,请记住这一点,并为可能发生的蓝屏做好准备(取决于您的ASIO设备类型)。

我敢肯定这里还潜藏着其他一些bug。如果您发现与实际应用程序逻辑无关,而是与特定音频设备或不同版本的.NET相关的bug,请报告给我,我会尽力解决该问题。

最后,请放轻松!:-) 这是我的第一个CodeProject投稿!

历史

  • SoloGig v1.0 - 初始发布
© . All rights reserved.