在Apple上构建无槽MIDI接口][游戏I/O插座

2020-07-12 11:12:59

在今天的即插即用外围设备的世界里,很难理解较低级别正在发生的事情的基本原理。计算机是如何连接到设备的?它是如何与设备通信的?软件是如何让设备施展魔力的?

我的名字是埃里克·兰格尔,我在20世纪80年代还是个十几岁的孩子。我的第一台电脑是1983年的Apple//e。在我家有电脑之前,我从哥哥的大学教科书上学习了基本编程,并练习了一年在纸上编写程序,直到苹果在哥哥的房间里找到了家。在我有限的计算机时间里,我练习了编码、调试和完善我的程序,直到它们做了我想要的事情。苹果][系列电脑]的设计目的是,如果用户花时间研究可用的文档并用机器进行实验,他们就可以了解机器如何工作的一切。今天,早期的苹果电脑可以帮助年轻人掌握电脑工作的基本原理,这将有助于他们在学习和职业生涯中取得进步。

在本文中,我将介绍一个简单的项目,该项目可以使用带有内部游戏I/O插座的Apple][系列计算机构建。它使用其中一个Annuncator数字输出将MIDI数据发送到MIDI乐器。在建造它的过程中,并坚持度过你遇到的任何问题,都会给你一种掌握和享受的感觉,给你一个表达你创造力的工具,并挑战你在学习更多先进的计算机科学概念的同时,继续修补这个项目。我们鼓励家长和教师学习如何构建这个项目,并在孩子们制造电子设备时帮助他们完成这个项目,用Basic编写简单的程序来控制设备,并想象可以使用设备的其他应用程序。

MIDI可以在键盘合成器上播放音符和音乐,还可以向控制音乐播放、鼓模式甚至照明的模块发送命令。MIDI使用非常简单的通信协议向乐器发送二进制消息。但这真的没有什么神奇之处-电脑只是发送代表命令的字节,比如“演奏中间的C”、“停止演奏中间的C”、“把乐器的声音改成小提琴”、“改变音量”。本项目的目标是让学生了解计算机如何根据接收数据的乐器理解的协议,使用特定的定时来改变输出端口上的电压水平。通过从头开始构建界面,学生知道数据是在他们连接的电线上传输的,并由他们编写的软件控制,使用的是概念上易于理解的驱动程序。

在开始构建界面之前,请阅读整篇文章并收集您需要的部分。许多现代乐器都有用于MIDI的USB接口。请寻找带有圆形5针DIN MIDI插座的老式合成器键盘,或具有圆形连接器的USB MIDI接口。*您可能需要MIDI耦合器才能将MIDI电缆连接到其中一个接口。

由于这个项目将建立在苹果公司[游戏I/O插座]上,因此第一个任务是建造一条电缆,使插座针脚更容易在计算机外部使用。最好的连接是16针到16针的电缆,其中一端插入插座,另一端插入面包板。如果您无法获得此电缆,您可以使用带凸针到凸针连接器的带状电缆来制作您自己的电缆。*如果此MIDI接口是您要在游戏I/O插座上构建的唯一项目,则只有3个引脚需要从外部布线。在Apple//e或//GS上,其中2个针脚(+5V和GND)可以来自电脑背板上的9针游戏连接器,使用DE-9连接器。

下图说明了将游戏插座连接到面包板的各种选项。请跟踪外部连接器上的哪些针脚与内部连接器上的哪些针脚相对应。在Apple//GS上,针脚1位于插座的左上角。*对于所有其他苹果,针脚1在插座的右下角。引脚从引脚1到引脚8编号,然后引脚9在引脚8的对面,然后使用其余引脚对引脚9-16进行编号。

在您继续下一步之前,您需要确保所有的电线都连接正确,并且来自Apple的信号正在到达面板。虽然构建MIDI接口项目只需要3个引脚,但请花时间测试内部游戏I/O插座上可用的附加信号。*以下所有管脚编号均指内部游戏I/O插座上的管脚编号。

1.测试+5V(引脚1)和GND(引脚8)之间的电压。您可以使用万用表验证电路板上的电压电平是否至少为+5伏。红色导线将端号1连接到电源侧孔,绿色导线将端号8连接到侧孔以接地。将万用表的探头连接到面包板的电源和地上,并将刻度盘设置为测量电压。

2.测试来自报警器输出的数字逻辑。4个报警器输出中的每一个都由映射到存储位置的一对软开关控制。每对中的一个将数字高信号发送到输出端,而该对中的另一个软开关发送数字低信号。

要测试0号报警器(引脚15)的高电平信号,请从Basic键入Call-151进入Apple Monitor,然后输入十六进制地址:C059,如下所示。*Apple将返回该内存位置的值,您可以忽略该值。现在您可以测试以验证Pin 15是否具有高信号。

连接万用表后,在Apple Monitor中输入十六进制地址:C058。电压应该降到一个非常低的值。

您还可以使用数字逻辑探头测试报警器的逻辑,如左侧所示。将探头端子连接到面板上的+5V和GND信号,然后将探头尖端触摸到报警器引脚。*下面的照片显示了数字逻辑探头在检测到报警器0上的逻辑高电压和逻辑低电压时如何响应。

来自发送设备的信号(左下图中标记为UART)通过2个逆变器,然后是220欧姆电阻器,然后发送到标记为MIDI OUT的圆形5针DIN连接器上的引脚5。+5V信号通过220欧姆电阻器发送到MIDI输出连接器的引脚4。引脚2连接到地面,MIDI电缆的屏蔽层。引脚1和3未连接。极性很重要,因为MIDI电缆将把您的MIDI输出端口连接到乐器的MIDI输入端口。在MIDI输出端口上发送的信号需要驱动MIDI输入电路中光隔离器内的光电晶体管。当来自UART的信号为负时,电流环路结束,光隔离器接收信号。通过遵循用于翻转信号以表示MIDI消息的比特和字节的定时协议来建立通信。在这个项目中,我们将使用苹果6502的计时来控制消息的计时,以说明没有什么神奇的事情发生-如果我们得到正确的计时并遵循协议,我们将成功地与MIDI乐器进行通信。

逆变器将输入信号从高改变为低,或将低改变为高。如此一来,两个反相器将保持输入信号不变。两个逆变器形成一个缓冲器,确保如果电路上的额外负载导致电压波动,信号不会降级。虽然可能不使用缓冲器直接从Apple驱动信号,但这会引入不确定因素,这可能会使您的设备在某些条件下不可靠。因此,最初我们将使用两个逆变器构建电路(遵循MIDI规范),然后测试修改它以仅使用一个逆变器(通过对驱动程序软件发送的所有信号进行逻辑反转)。

使用逻辑探针验证每组可能输入的每个芯片的输出。在项目中使用芯片之前,请使用电池或电子套件对其进行测试。*下面的照片显示了如何使用逻辑探头测试7404十六进制逆变器芯片的一个逆变器。探头的+5V和GND鳄鱼夹连接到面板上的相应总线。然后将探头尖端触摸到逻辑门输出。*在左边的照片中,引脚1(黄线)连接到+5V,因此逻辑探针在引脚2上读低。在右边的照片中,引脚1连接到GND,所以逻辑探针在引脚2上读高。对于两个电路,引脚7连接到GND,引脚14连接到+5V。

有几种集成电路芯片可用于构建此电路所需的缓冲器:

上面的两个面包板显示了可能用于此项目的三个芯片。左边的面包板上显示4011芯片,底部显示4001芯片。右边的面板显示7404芯片。*来自SparkFun的MIDI插座显示在左侧面包板的顶部,有3个跳线将引脚2、4和5的端子连接到右侧的孔。*如果您使用4011或4001芯片,请将每个门的两个输入连接在一起,以从NAND或NOR门创建反相器。*搜索每个芯片的引脚和数据表,以了解它们应该如何在电路中连接。

使用逻辑探针验证每组可能输入的每个芯片的输出。在项目中使用芯片之前,请使用电池或电子套件对其进行测试。*下面的照片显示了如何使用逻辑探头测试7404十六进制逆变器芯片的一个逆变器。探头的+5V和GND鳄鱼夹连接到面板上的相应总线。然后将探头尖端触摸到逻辑门输出。*在左边的照片中,引脚1(黄线)连接到+5V,因此逻辑探针在引脚2上读低。在右边的照片中,引脚1连接到GND,所以逻辑探针在引脚2上读高。对于两个电路,引脚7连接到GND,引脚14连接到+5V。

在照片左边,7404芯片的所有6个输出都连接到LED,6个门中每个门的所有输入都连接到GND。*所有6个LED都亮起,因为所有输出都很高。芯片中的TTL逻辑放大电流,并在驱动每个LED的每个输出上提供+5V。*通过将一个逆变器的输出连接到另一个逆变器的输入,可以用两个逆变器构成缓冲电路。请注意,对于某些逻辑芯片,所有未使用的输入必须连接到GND,电路才能工作。

下图显示了如何将Apple Game I/O连接器连接到7404十六进制变频器芯片。在进行这些连接时,请确保关闭苹果的电源。

1.蓝色连接器右下角的Apple引脚1(+5V)连接到面板上的+5V总线,并连接到7404芯片的引脚14(右上角引脚-红线)。

2.蓝色连接器右上角的苹果引脚8(GND)连接到面包板上的GND总线,并连接到7404芯片的引脚7(左下引脚-黑线)。

3.蓝色连接器左下角最低引脚上方的引脚上的苹果引脚15(AN0)通向7404芯片的引脚1(变频器输入,左上角引脚,白线)。

4.7404芯片的引脚2(逆变器输出)连接到引脚3(逆变器输入),红线。

5.将220欧姆电阻器连接到7404变频器的引脚4(逆变器输出),然后将电阻器的另一端连接到MIDI插座的引脚5(黄线)。因为MIDI插座的孔在底部,所以下面照片中从左到右显示的针脚是5、2、4。

6.将220欧姆电阻器连接到7404变频器(+5V)的引脚14。然后将电阻器的另一端连接到MIDI插座的引脚4(红线)。

7.将MIDI插座的针脚2连接到7404变频器(GND)的针脚7。

8.将MIDI电缆从MIDI插座连接到您的MIDI乐器。MIDI乐器需要有一个标有MIDI IN(或“TO MIDI OUT”)的圆形5针DIN端口。

您已经为接口构建了硬件,并将其连接到您的Apple。苹果将如何与接口通信?需要一个驱动程序来控制接口的电子设备。对于此接口,驱动程序将在精确的时间从报警器输出发送高和低信号,这些信号将被您的MIDI乐器解释为命令。*需要一种通信协议-一种协议,规定何时发送什么信号,应该如何解释这些信号,以及在收到特定命令时乐器应该如何表现。此协议记录在MIDI规范和许多其他在线资源中。

驱动软件从何而来?(苹果)(电脑用软盘加载软件。*如果您的Apple有5.25英寸软盘驱动器,您可以使用ADT Pro等软件从磁盘映像文件创建磁盘。或者,如果您有软盘EMU等硬件设备,您可以将磁盘映像文件复制到Micro SD卡,然后从该设备加载磁盘映像。*包含此MIDI接口驱动程序软件的磁盘映像可从Github下载,网址为:

单击“克隆或下载”按钮,将整个项目下载为ZIP文件。

包含驱动程序软件的磁盘映像位于DSK子目录中,名为ANN0TEST.DSK。您需要从此磁盘映像创建软盘,或将文件复制到SD卡以用于硬件软盘仿真设备。*下图显示了如何使用ADT Pro通过连接到Apple超级串行卡的串行电缆将Windows笔记本电脑上的软盘映像文件(位于C:\ADTPRO\Disks)复制到Apple 5.25软盘。*有关更多信息,请访问:

当您在连接MIDI接口的Apple上启动软盘时,您将看到上面的菜单。

如果你听到和弦演奏,给自己一个大大的掌声!当你建造了一个电子设备,成功地用MIDI将一台老式苹果电脑连接到一件电子乐器上!

如果您没有听到和弦播放,请休息一下并计划您的故障排除策略。

如果您使用的是Apple IIgs,它需要以正常速度(1 MHz)运行。“这是在控制面板中完成的。

否则,检查您的电子连接,看看是否有任何连接不正确的电线、不完整的电路或短路。我会花时间测试,看看是否有足够的电流到达逻辑芯片。有时你不得不后退一步,撤销一些工作,甚至重新开始。他们学会在挫折中工作,进行观察,并使用科学的方法来推断正在发生的事情。

当您的界面正常工作时,请看一下播放和弦的基本程序。

第1行执行名为MIDIDRVR.OBJ的二进制文件。该文件包含机器语言指令,这些指令使用基于MIDI Wire协议规范的特定定时来控制报警器输出的切换。然后,第2行跳过第3、5和6行上的子例程。

第3行调用驱动程序中的子例程,将MIDI数据从接口发送出去。

第5行和第6行可以忽略-它们是另一个控制MIDI吉他指板上的LED的程序遗留下来的。您也可以忽略第10行的注释-它是吉他程序使用MIDI SysEx消息。

行10和20将要发送的MIDI数据插入到空闲存储块中。*线路100和110上将存储14个字节的数据。此数据包含控制乐器上音符播放的MIDI消息。

第30行告诉驱动程序,当我们调用驱动程序时,应该发送7个字节(行100上的数据)。数字7戳在存储器地址$D7(13*16+7)。

第40行告诉驱动程序应该在内存中的什么位置找到我们要发送的7个字节。地址768=3*256。如果以十六进制表示,则写为0300美元。地址的低位字节($00)首先在十六进制地址$CE(12*16+4)处戳,高位字节($03)在$CF(12*16+15)处戳。

第43-45行打印一条提示消息,并等待用户按Return键。

第50行调用第3行上的子例程,将MIDI数据发送给驱动程序。然后和弦开始演奏。

第60行提示用户按Return,然后等待用户输入。但和弦仍在继续演奏。

第70行将MIDI消息的地址更改为$0307,因此它现在指向来自第110行的数据,其中包含停止和弦每个音符的MIDI指令。

行80调用行3上的子例程以将MIDI数据发送给驱动程序。然后和弦停止演奏。

第50行调用第3行上的子例程,将MIDI数据发送给驱动程序。然后和弦开始演奏。

第60行提示用户按Return,然后等待用户输入。但和弦仍在继续演奏。

第70行将MIDI消息的地址更改为$0307,因此它现在指向来自第110行的数据,其中包含停止和弦每个音符的MIDI指令。

行80调用行3上的子例程以将MIDI数据发送给驱动程序。然后和弦停止演奏。

144、60、127=留言中的MIDI音符,音符#60=中C,127=最大音量。

64,127=消息中的MIDI音符,音符#64=中C以上的E,127=最大音量。

只要一系列MIDI消息具有相同的命令(例如:144=注释打开),就可以省略命令字节。这就是所谓的“运行状态”。E的音符编号是64,因为在钢琴键盘上,音符E比C高4个半音,所以如果C是60,那么C#=61,D=62,D#=63,E=64。

67,127=消息中的MIDI音符,中C以上的音符#67=G。如果我们从E=64开始计数,则F=65,F#=66,G=67。

144、60、0=留言中的MIDI音符,音符#60(中C),0=最小音量(无声)。*当音符打开消息的音量为0时,它实质上是音符关闭消息。(注:可以使用单独的MIDI音符关闭消息来代替此消息,效果相同)。

现在轮到您试验这个程序了,边走边学习MIDI。

运行程序。“它现在做什么呢?我会记下你的观察结果,并用代码进行试验。”可以更改数据以播放不同的音符。“你将如何演奏相同的音符,高或低一个八度?我们可以通过改变节目来播放你最喜欢的歌曲,这是一件很有趣的事情。”我尝试写入子例程来播放一系列音符,并多次调用子例程。

此外,请尝试运行MIDI Format 0播放器程序(主菜单上的选项2)。*当提示播放MFF0文件时,输入。

PEANUTS0.MID如下所示。然后按Return键播放音乐。注:此程序需要80列和128K内存。

当音乐播放时,您将看到80列屏幕上显示的音符名称。

下面的屏幕截图显示了正在演奏的D大调和弦。*大写的F表示F#音符。

该程序是Applesoft和机器语言代码的组合,对MIDI接口使用相同的驱动程序。

现在您可以看到如何将硬件的应用程序代码与驱动程序代码分开。应用程序代码处理从磁盘上的歌曲文件加载音乐数据、应发送音符的时间(基于文件中的数据)以及正在播放的音符的显示。*驱动程序处理与硬件的所有通信。

同样的原理也被用于现代计算机应用中。*当您在现代计算机上安装外围设备(如打印机)时,需要驱动程序才能使计算机与硬件通信。然后,应用软件需要知道如何与驱动程序通信,使其执行高级任务,如打印文档。

此项目显示了您的。

.