- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在创建一个需要二进制输出才能运行的项目。我有一系列 IF 语句来确定输出是什么,这里一切都很好。问题是我使用的是 PIC 微 Controller 16F877 并用 C 语言编程。我使用 RS232 将信息直接发送到 MIDI Controller ,其中包含大约 8 个音符值和 8 个音量值(8x8 组选项)。
我也使用proteus和CCS来编程。
我的问题是:如何以二进制形式创建 MIDI 输出?我知道所有二进制值,但我不确定如何创建“midi 友好”输出。
编辑:根据请求添加示例代码:
#include <16F877.h>
TRISB=1; //sets all tris in portB to 1, to allow as inputs
TRISD=1; //sets all tris in portD to 1, to allow as inputs
TRISC.RC6=0; //sets trisC port 6 to 0, to allow as an output
#use rs232(baud=9600,parity=N,xmit=STDOUT,rcv=None,bits=8,stream=PORT1,float_high)
// initialises RS232 and configures for transmision
#use delay(crystal=4MHz)
// crystal at 4MHz is used (XT MODE)
#define X1 PIN_B0 //names pin B0 as X1
#define X2 PIN_B1 //names pin B1 as X2
#define X3 PIN_B2 //names pin B2 as X3
#define X4 PIN_B3 //names pin B3 as X4
#define X5 PIN_B4 //names pin B4 as X5
#define X6 PIN_B5 //names pin B5 as X6
#define X7 PIN_B6 //names pin B6 as X7
#define X8 PIN_B7 //names pin B7 as X8
#define STDOUT PIN_C6 // Names pin C6 as STDOUT
#define Y1 PIN_D0 //names pin D0 as Y1
#define Y2 PIN_D1 //names pin D1 as Y2
#define Y3 PIN_D2 //names pin D2 as Y3
#define Y4 PIN_D3 //names pin D3 as Y4
#define Y5 PIN_D4 //names pin D4 as Y5
#define Y6 PIN_D5 //names pin D5 as Y6
#define Y7 PIN_D6 //names pin D6 as Y7
#define Y8 PIN_D7 //names pin D7 as Y8
char xout;
char yout;
int main (void)
{
if(B0==1) //if B0 is 1, sets xout to "A"
{
xout='A';
}
if(B1==1) //if B1 is 1, sets xout to "B"
{
xout='B';
}
if(B2==1) //if B2 is 1, sets xout to "C"
{
xout='C';
}
if(B3==1) //if B3 is 1, sets xout to "D"
{
xout="D";
}
if(B4==1) //if B4 is 1, sets xout to "E"
{
xout='E';
}
if(B5==1) //if B5 is 1, sets xout to "F"
{
xout='F';
}
if(B6==1) //if B6 is 1, sets xout to "G"
{
xout='G';
}
if(B7==1) //if B7 is 1, sets xout to "H"
{
xout='H';
}
if(D0==1) //if D0 is 1, sets yout to "A"
{
yout='A';
}
if(D1==1) //if D1 is 1, sets yout to "B"
{
yout='B';
}
if(D2==1) //if D2 is 1, sets yout to "C"
{
yout='C';
}
if(D3=1) //if D3 is 1, sets yout to "D"
{
yout='D';
}
if(D4==1) //if D4 is 1, sets yout to "E"
{
yout='E';
}
if(D5==1) //if D5 is 1, sets yout to "F"
{
yout='F';
}
if(D6==1) //if D6 is 1, sets yout to "G"
{
yout='G';
}
if(D7==1) //if D7 is 1, sets yout to "H"
{
yout='H';
}
printf("%c,%c", xout yout); //outputs xout and yout for display on a screen
用二进制代码代替字母(它们只是为了演示实际输出,以便我可以进入 midi),printf 将输出 IF 语句中确定的 midi 值
编辑 2:进一步了解
我基本上将使用一个 8x8 的“开关”网格(使用可见光作为接口(interface)方式),x 轴控制音符,Y 轴控制音量。我只需要一个输出,该输出将通过 5 针 DIN 直接连接到 MIDI Controller
最佳答案
我可能会只使用 2 个命令(NoteOn、NoteOff)开始,然后根据需要继续。
下面是一个示例“架构”,我可能会用它来入门。由于您需要跟踪“note on”和“note off”操作,因此我添加了全局“state”数组。第一索引以交替方式在当前状态和旧状态之间变化。对于初学者来说,这可能就足够了。
8 个插槽可容纳 8 个 key 。如果按下该键,该值可能是“音量”代码。如果没有按下该音调的键,则为 KEY_OFF。
#define KEY_OFF 0x80 // command parameters only use lower 7 bits...
static uint8_t state[2][8];
static void Configure()
{ // Do what you need to do in terms of initializing pins, serial port, etc...
}
static void UpdateState(uint8_t index)
{
// read pins into the global state variable at first index "index"
// Not pressed "tones" get value "OFF".
// TIP: later, you could consider to use PIC
// "interrupt on change" features
// to save power.
// Tip: Depending on the types of your keys and your circuitry,
// you might run into "bouncing keys" problems.
// But the fact, that you send your serial messages synchronously
// gives your keys some time to "settle", which might be enough.
}
// ROM based lookup table
// TODO: fill in correct values for your note-key to note-to-play mapping.
static const uint8_t notes[8] =
{ 0x01
, 0x01
, 0x01
, 0x01
, 0x01
, 0x01
, 0x01
, 0x01
};
static const uint8_t velocities[8] =
{
// TODO: 8 entries mapping your "volume key" code to a MIDI "velocity" code.
};
#define DEFAULT_CHANNEL 0x00 // 16 channels available in midi... 0x00..0x0F
static void SerialSend(uint8_t count, const uint8_t * message)
{ // TODO: Implement sending the message on Rs232...
// TIP: Use the flag "tx buffer EMPTY" before you write next byte.
for( uint8_t i = 0; i < count; ++i )
{
while( !TXEMPTY ); // TODO: look up correct name ...
TX = message[i]; // TODO: look up correct name...
}
}
// Assuming to use only channel 0 here...
static void SendNoteOff(uint8_t note)
{
// TODO: find out if NoteOff needs a "real" velocity value...
uint8_t midiCmd[3] = { 0x80|DEFAULT_CHANNEL, notes[note], 0x00 };
SerialSend(3, midiCmd);
}
static void SendNoteOn(uint8_t note, uint8_t velocity)
{
uint8_t midiCmd[3] = { 0x90 | DEFAULT_CHANNEL, notes[note], velocities[velocity] };
SerialSend(3, midiCmd);
}
// Named it emain() as it is in some random file of mine which already has a main ;)
void emain()
{
Configure();
uint8_t current = 0;
uint8_t old = 1;
while (1)
{
UpdateState(current);
for (uint8_t i = 0; i < 8; ++i)
{
uint8_t os = state[old][i];
uint8_t cs = state[current][i];
if (os != cs )
{
if (0x00 != (cs & KEY_OFF))
{
SendNoteOff(i);
}
else
{
SendNoteOn(i, cs);
}
}
}
old = current;
current = (current + 1) % 2;
}
}
关于c - 使用 PIC 微处理器上的 C 语言进行二进制输出以实现 MIDI 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29760886/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!