您想像在圣安德烈亚斯一样在广播电台之间切换吗?

GTA的配乐因精选音乐和有趣的插入声而闻名。 Rockstar在为该游戏创建广播电台方面做得非常出色-顺便说一句,甚至可以从CD中购买Vice City和San Andreas的音乐。
为了使她的聆听更加愉快-并学到一些东西,我决定侵入收音机,以便可以接收游戏收音机。
这个想法是,您可以像实际接收器一样旋转接收器的旋钮并在虚拟工作站之间切换。 软件成为主要障碍-我希望每个虚拟电台都播放自己的音乐,即使我不听音乐也是如此。 再次,如在现实世界中。
让我们开始吧!
1.设备
我很想在便携式项目和内置设备中使用像Arduino这样的项目,因为这样的板的体系结构比单板计算机要简单得多。

但是同时播放数十个文件需要强大的大脑,所以我选择了Raspberry Pi。 我已经将它用于其他项目,并且在使用它时感到很有信心。 我选择Python作为编程语言,只是因为我有这样的心情。 还有其他原因吗?
2. Python软件混合器
之后,我需要为Python选择一个库,该库可以:
要构建虚拟收音机,我只需要一次上传几个文件并控制播放音量。 实际上,实际上发生了这种情况:每个电台都是一个音频源,并且从收听者的角度来看,调整旋钮会更改这些源的音量。
在对各种选项(pygame-mixer,python-sounddevice,带有混音器修补程序的puredata)进行了艰苦漫长的测试之后,我选择了swmixer。 他甚至知道如何在不将文件加载到整个内存的情况下播放流媒体文件,这对我来说非常方便,因为我希望每个电台将所有音乐组合到一个文件中。 我不得不派生这个库并修复其中的错误,因为不再支持它。
我决定使用Raspberry Pi 3,因为2B模型以某种方式钳制了音频输出。 我不了解为什么会发生这种情况,但只是对所有事情都能在新板上工作感到满意,所以我继续下一步。
3.高级角度传感器(DUP)(签出pyKY040)

当时,对于KY040 DUP来说,最好的Python库是一个名为
KY040的库,但是它并不能完全满足我的需求,此外,我想尝试为Python创建自己的第一个真实模块,这就是为什么我编写
pyKY040的原因。
它提供:
- Kolbek增加价值。
- 回调减少。
- 科尔贝克的变化。
- 回调按钮单击。
设定:
- 缩放模式(内部计数器在X到Y的边界内变化,作为参数传递给回调函数)。
- 环形刻度模式(从X到Y,然后再到X)。
- 在刻度上设置步长。
他允许我委托DUP的逻辑,并专注于与他互动时发生的事情。
在主代码中,以下几行属于DUP:
tuning_encoder = pyky040.Encoder(CLK=17, DT=27, SW=22) tuning_encoder.setup(scale_min=MIN_VFREQ, scale_max=MAX_VFREQ, step=1, chg_callback=vfreq_changed) tuning_thread = threading.Thread(target=tuning_encoder.watch) volume_encoder = pyky040.Encoder(CLK=5, DT=6, SW=13) volume_encoder.setup(scale_min=0, scale_max=10, step=1, inc_callback=inc_global_volume, dec_callback=dec_global_volume, sw_callback=toggle_mute) global_volume_thread = threading.Thread(target=volume_encoder.watch) tuning_thread.start() global_volume_thread.start()
4.虚拟广播(代码)
现在,我可以播放文件了,并且有了使用DUP的界面。 现在该为虚拟无线电编写代码了。
它的工作原理类似于虚拟无线电波段。 在某些虚拟频率(或高音)下,您可以听到声音-这些是混音器通道。 在两个高音之间听到了两个音频源的混合。
Chn 1 Chn 2 Chn 3 Chn 4 Chn n | | | | | |--------------|--------------|--------------|-------------| <---------------------------------------------------------->
虚拟频率实际上只是一个整数,它会根据您与DUP的交互而增加或减少。
为了在两个高音之间切换时计算音量时留有更大的自由度,此过程由单个函数处理,该函数返回给定高音给定电台的音量。 到目前为止,该值是线性变化的,但是可以通过创建更嘈杂且不稳定的音量曲线来更改。
VOLUME /-\ /-\ /- | --\ /-- | --\ -- | --\ /-- | -- | --\ /-- | | -\ /- | | --\ /-- | | --\ /-- | | --\ /-- | | /-- | | /-- --\ | | /-- --\ | | /-- --\ | | /- -\ | | /-- --\ | -\ | /-- --\ | /- --\ | /-- --\ | /-- ------------------------------------------------------- | vfreq |
如果我们将此示例应用于通道n-1,则它与通道n相交,从而导致来自这两个源的音频混合。
在伪代码中,它看起来像这样:
( ) -> [ -> [ ( ) , 0 ] ] ->
所有详细信息都在代码中。 从描述DUP的回调的文件末尾开始,然后按照跟踪进行操作。
5.破解收音机外壳
捐赠者是我祖父的收音机Optalix TO100。 在法国以外,我相信要找到他并不容易。 只需约
20欧元,您就可以得到一个时尚,紧凑的老式接收器,可以随身携带。
DUP
DUP本身就爬了起来,才有可能合上箱子-但在连接跳线之后,设计却变得太大了。 我必须拆下原来的塑料连接器,并用热收缩代替它,以便可以弯曲。


我自己购买的那些DUP没有螺纹-我不得不即兴使用纸板和热塑性胶水将它们固定在箱子上。 克莱一如既往地做出决定。


树莓派
我将电源连接器移到了机箱上,而不是直接将电缆插入Pi中-因此,我可以选择如何将计算机放置在机箱中,而无需考虑电源连接器应在机箱上的确切位置。


我使用了带有微型USB连接器“母亲”和“父亲”的电缆,但是为了释放更多空间,我剥去了电缆,直接焊接到Pi-加焊接到PP2,减去焊接到接地的连接器(另一个选择是PP5)。 并确保增加胶水,以免脱落。

讲者
扬声器-TO100接收器的原始5W功率。 它连接到放大器,放大器连接到3.5毫米音频插头,该插头插入
廉价的USB DAC中 。

一切都通过原型板连接,并准备永久关闭。

