- 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/
我正在尝试将谷歌地图集成到 Xamarin Android。但是,如标题中所写,收到错误。此错误出现在我的 SetContentView (Resource.Layout.Main); 上,如下所示:
在 Delphi 中如何以非文本模式打开二进制文件?类似于 C 函数 fopen(filename,"rb") 最佳答案 有几个选项。 1。使用文件流 var Stream: TFileStrea
我现在正在处理一个问题,如下所示: 有两个数字 x1 和 x2 并且 x2 > x1。 例如 x1 = 5; x2 = 10; 而且我必须在二进制表示中找到 x1 和 x2 之间的总和。 5 = 10
我有这个“程序集”文件(仅包含 directives ) // declare protected region as somewhere within the stack .equiv prot_s
有没有办法在powershell中确定指定的文件是否包含指定的字节数组(在任何位置)? 就像是: fgrep --binary-files=binary "$data" "$filepath" 当然,
我是一名工程师,而不是软件程序员,所以请原谅我的无知。 我编写了一个 Delphi(7SE) 程序,用于从连接到两个数字温度计的 USB 端口读取“真实”数据类型。 我已经完成了该计划的大部分内容。
我有一些代码,例如: u=(float *)calloc(n, sizeof(float)); for(i=1; i
typedef struct pixel_type { unsigned char r; unsigned char g; unsigned char b;
如何判断二进制数是否为负数? 目前我有下面的代码。它可以很好地转换为二进制文件。转换为十进制时,我需要知道最左边的位是否为 1 以判断它是否为负数,但我似乎无法弄清楚该怎么做。 此外,我如何才能让它返
我有一个带有适当重载的 Vect*float 运算符的 vector 类,我正在尝试创建全局/非成员 float*Vect 运算符,如下所示:(注意这是一个经过大量编辑的示例) class Vect
对于使用 C 编程的项目,我们正在尝试将图像转换为二进制数据,反之亦然。我们在网上找到的所有其他解决方案都是用 C++ 或 Java 编写的。这是我们尝试过的方法: 将图像转换为包含二进制数据的文本文
我需要对列表的元素求和,其中包含所有零或一,如果列表中有 1,则结果为 1,否则为 0。 def binary_search(l, low=0,high=-1): if not l: retu
我到处搜索以找到将 float 转换为八进制或二进制的方法。我知道 float.hex 和 float.fromhex。是否有模块可以对八进制/二进制值执行相同的工作? 例如:我有一个 float 1
当我阅读有关 list.h 文件中的 hlist 的 FreeBSD 源代码时,我对这个宏感到困惑: #define hlist_for_each_entry_safe(tp, p, n, head,
我不知道出了什么问题,也不知道为什么会出现此错误。我四处搜索,但我终究无法弄明白。 void print_arb_base(unsigned int n, unsigned int b) {
在任何语言中都可以轻松地将十进制转换为二进制,反之亦然,但我需要一个稍微复杂一点的函数。 给定一个十进制数和一个二进制位,我需要知道二进制位是开还是关(真或假)。 示例: IsBitTrue(30,1
在下面的代码中,我创建了两个文件,一个是文本格式,另一个是二进制格式。文件的图标显示相同。但是这两个文件的特征完全相同,包括大小、字符集(==二进制)和流(八位字节)。为什么没有文本文件?因为如果我明
我想通读一个二进制文件。谷歌搜索“python binary eof”引导我here . 现在,问题: 为什么容器(SO 答案中的 x)不包含单个(当前)字节而是包含一大堆字节?我做错了什么? 如果应
为什么只允许以 10 为基数使用小数点?为什么以下会引发语法错误? 0b1011101.1101 我输入的数字是否有歧义?除了 93.8125 之外,字符串似乎没有其他可能的数字 同样的问题也适用于其
boost 库中有二进制之类的东西吗?例如我想写: binary a; 我很惭愧地承认我曾尝试找到它(Google、Boost)但没有结果。他们提到了一些关于 binary_int<> 的内容,但我既
我是一名优秀的程序员,十分优秀!