2011�N01��23��

PIC18F2550�ɂ��USB MIDI�C���^�[�t�F�C�X�̐���

PIC18F2550���g����1����1�o�͂�USB MIDI�C���^�[�t�F�C�X���쐬���邱�Ƃɐ������܂����B

�܂��͉�H�}�ł��BMIDI�W���b�N�̓��o�͂͂���܂łɍs���Ă��܂��̂œ��M���邱�Ƃ͑�������܂���B
�EUSB�R�l�N�^�̒[�q��PIC18F2550�̂�����ׂ��s���ɂ‚Ȃ���
�EMIDI���͂̓t�H�g�J�v��TLP552�Ŏ󂯂�RX��
�EMIDI�o�͂�TX�s������
�E20Mhz�̃Z�����b�N���g�p

PIC18F2550USBMIDI.PNG

�H����PIC18F2550��iAE-18F2550�j�Ńv���g�^�C�v������Ă����̂ŃN���b�N���g����20Mhz�ō��킹�܂����B���������i�_�������炷���߃R���f���T�����̃Z�����b�N���g�p���܂����B�܂��AMCLR�s����10k��R�AVUSB�[�q�̃R���f���T���ꉞ���킹�Ď������܂����B

�v���O�����͎��̒ʂ�ł��B�|�C���g�������‚�����܂��B
�E���C�����[�v�̒��ł�USB��M�AMIDI��M�AMIDI���M�AUSB���M��4�‚̃^�X�N���񂵂Ă��܂����A�e�^�X�N�ԂŃL���[����ăf�[�^������肵�Ă��܂��B
�Equeue_t�Adw_queue_t�Ƃ���Ɋ֘A����֐����L���[�\���Ƃ��̑���̒�`�ł��B�o�C�g��̃L���[��USB MIDI�p�P�b�g�i4�o�C�g�j�̃L���[��2�‚��K�v�������̂œ����悤�Ȃ��̂��d�ɒ�`���܂����BC++���ƃe���v���[�g�ł�����̂ł���C����̌��E�ł��B
�EUSB��MIDI�̓p�P�b�g�𕪉�����MIDI�o�̓L���[�ɍڂ��邾���ōςނ̂ł����AMIDI��USB��MIDI�̃o�C�g���MIDI�p�P�b�g�ɑg�ݗ��ĂȂ���΂����܂���Bprocess_midi_in�ł��������Ă��܂��B
�E#pragma udata MIDI_IN_QUEUE=0x700�Ƃ���������midi_in_queue���z�u�����A�h���X���w�肵�Ă��܂��BPIC18F2550�ł́iPIC�ł͈�ʓI�Ɂj�������Ƀo���N�Ƃ����T�O������A�o���N���܂������ĘA�������̈���Ƃ�܂���B���̔z��͑傫���̂Ńo���N�̐擪����n�܂�悤�Ɏw�肵�āA�o���N����͂ݏo�Ȃ��悤�ɂ��Ă��܂��B

main.c

#include <USB/usb.h>
#include <USB/usb_function_midi.h>
#include <p18f2550.h>
#include <delays.h>
#include <stdio.h>
#include <usart.h>

#include "config.h" /* configuration bits */

void setup_usart(void);
void process_midi_in(BYTE);

#pragma udata USB_VARIABLES=0x500
unsigned char ReceivedDataBuffer[64];
USB_AUDIO_MIDI_EVENT_PACKET midiData;

#pragma udata
USB_HANDLE USBRxHandle = 0;
USB_HANDLE USBTxHandle = 0;

/*
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode() {
USBDeviceTasks();
}*/

#pragma code

int size_of_cin[] = { 0, 0, 2, 3, 3, 1, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1 };

#define QUEUE_SIZE (60)

typedef struct {
int head;
int tail;
BYTE buffer[QUEUE_SIZE];
} queue_t;

int enqueue(BYTE ch, queue_t* queue) {
int next_tail = (queue->tail + 1) % QUEUE_SIZE;
if (next_tail == queue->head) return -1;
queue->buffer[queue->tail] = ch;
queue->tail = next_tail;
return 0;
}

BYTE dequeue(queue_t* queue) {
BYTE ch = queue->buffer[queue->head];
queue->head = (queue->head + 1) % QUEUE_SIZE;
return ch;
}

int is_empty(queue_t* queue) {
return queue->head == queue->tail;
}

void init_queue(queue_t* queue) {
queue->head = queue->tail = 0;
}

typedef struct {
int head;
int tail;
DWORD buffer[QUEUE_SIZE];
} dw_queue_t;

int enqueue_dw(DWORD ch, dw_queue_t* queue) {
int next_tail = (queue->tail + 1) % QUEUE_SIZE;
if (next_tail == queue->head) return -1;
queue->buffer[queue->tail] = ch;
queue->tail = next_tail;
return 0;
}

DWORD dequeue_dw(dw_queue_t* queue) {
DWORD ch = queue->buffer[queue->head];
queue->head = (queue->head + 1) % QUEUE_SIZE;
return ch;
}

int is_empty_dw(dw_queue_t* queue) {
return queue->head == queue->tail;
}

void init_queue_dw(dw_queue_t* queue) {
queue->head = queue->tail = 0;
}

queue_t midi_out_queue; //= { 0, 0, {0} };
//queue_t midi_in_queue; //= { 0, 0, {0} };


#pragma udata MIDI_IN_QUEUE=0x700
dw_queue_t midi_in_queue; //= { 0, 0, {0} };

#pragma code

void put(char ch) {
while(BusyUSART());
WriteUSART(ch);
}

void main(void) {
char msg[17];
USB_AUDIO_MIDI_EVENT_PACKET* midi_datum;
int size, i;

TRISA = 0;
TRISB = 0;
PORTC = 0;
TRISC = 0;
ADCON1 |= 0b1111;
INTCON = 0;
CMCON = 0x07;

init_queue(&midi_out_queue);
init_queue_dw(&midi_in_queue);

setup_usart();

PORTAbits.RA0 = 1;

//USBDeviceAttach();
USBDeviceInit();

while(1) {
USBDeviceTasks();
if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) continue;
if(!USBHandleBusy(USBRxHandle))
{
midi_datum = (USB_AUDIO_MIDI_EVENT_PACKET*)&ReceivedDataBuffer;
size = size_of_cin[midi_datum->CodeIndexNumber];
for (i = 0; i < size; i++) {
enqueue(midi_datum->v[i+1], &midi_out_queue);
}
USBRxHandle = USBRxOnePacket(1,(BYTE*)&ReceivedDataBuffer,64);
//enqueue_dw(midi_datum->Val, &midi_in_queue);
}
if (DataRdyUSART()) {
process_midi_in(ReadUSART());
}
if (!is_empty(&midi_out_queue) && !BusyUSART()) { /* BusyUSART sees TRMT */
put(dequeue(&midi_out_queue)); /* put data to TXREG */
}
if (!is_empty_dw(&midi_in_queue) && !USBHandleBusy(USBTxHandle)) {
PORTAbits.RA0 = 0;

midiData.Val = dequeue_dw(&midi_in_queue);
midiData.CableNumber = 0;
USBTxHandle = USBTxOnePacket(1, (BYTE*)&midiData, 4);

PORTAbits.RA0 = 1;
}
}
}

#define is_status_byte(ch) ((ch) & 0b10000000)
#define is_channel_message(ch) ((ch) >= 0x90 && (ch) < 0xf0)

BYTE cin_of_system_message[] = {
MIDI_CIN_SYSEX_START,
MIDI_CIN_MTC,
MIDI_CIN_SSP,
MIDI_CIN_SONG_SELECT,
0,
0,
MIDI_CIN_1_BYTE_MESSAGE,
0,
MIDI_CIN_SINGLE_BYTE,
0,
MIDI_CIN_SINGLE_BYTE,
MIDI_CIN_SINGLE_BYTE,
MIDI_CIN_SINGLE_BYTE,
0,
MIDI_CIN_SINGLE_BYTE,
MIDI_CIN_SINGLE_BYTE
};

BYTE cin_of_status_byte(BYTE ch) {
if (is_channel_message(ch)) return ch / 16;
else return cin_of_system_message[ch - 0xf0];
}

void process_midi_in(BYTE ch) {
static USB_AUDIO_MIDI_EVENT_PACKET midi_datum;
static int current_size = 0;
int size, i;

if (is_status_byte(ch)) {
midi_datum.Val = 0;
midi_datum.CodeIndexNumber = cin_of_status_byte(ch);
midi_datum.CableNumber = 0;
midi_datum.DATA_0 = ch;
current_size = 1;
} else {
if (current_size == 0) current_size++;
midi_datum.v[current_size + 1] = ch;
current_size++;
}
if (current_size == size_of_cin[midi_datum.CodeIndexNumber]) {
enqueue_dw(midi_datum.Val, &midi_in_queue);
current_size = 0;
}

}

BOOL USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, WORD size) {
switch(event) {
case EVENT_CONFIGURED:
USBEnableEndpoint(1,USB_OUT_ENABLED|USB_IN_ENABLED|USB_HANDSHAKE_ENABLED|USB_DISALLOW_SETUP);
//USBEnableEndpoint(1,USB_OUT_ENABLED|USB_HANDSHAKE_ENABLED|USB_DISALLOW_SETUP);
USBRxHandle = USBRxOnePacket(1,(BYTE*)&ReceivedDataBuffer,64);
break;
case EVENT_SET_DESCRIPTOR:
case EVENT_EP0_REQUEST:
case EVENT_SOF:
case EVENT_SUSPEND:
case EVENT_RESUME:
case EVENT_BUS_ERROR:
case EVENT_TRANSFER:
default:
break;
}
return TRUE;
}

void setup_usart(void) {
RCSTAbits.SPEN = 1;
RCSTAbits.RX9 = 0;
RCSTAbits.CREN = 1;
TXSTAbits.TX9 = 0;
TXSTAbits.TXEN = 1;
TXSTAbits.SYNC = 0;
TXSTAbits.BRGH = 0;
BAUDCONbits.BRG16 = 0;
SPBRG = 23;
}


config.h

#pragma config PLLDIV = 5 // Divide by 5 (20 MHz oscillator input)
#pragma config USBDIV = 2 // USB clock source comes from the 96 MHz PLL divided by 2
#pragma config CPUDIV = OSC1_PLL2 // 96 MHz PLL Src: /2
#pragma config FOSC = HSPLL_HS // HS oscillator, PLL enabled, HS used by USB

#pragma config FCMEN = OFF // Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF // Oscillator Switchover mode disabled
#pragma config PWRT = OFF // PWRT enabled
#pragma config BOR = ON // Brown-out Reset enabled in hardware only (SBOREN is disabled)
#pragma config BORV = 3 // Minimum setting
#pragma config VREGEN = ON // USB voltage regulator enabled

#pragma config WDT = OFF // HW Disabled - SW Controlled
#pragma config WDTPS = 32768

#pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled
#pragma config LPT1OSC = OFF // Timer1 configured for higher power operation
#pragma config PBADEN = ON // PORTB<4:0> pins are configured as analog input channels on Reset
#pragma config CCP2MX = ON // CCP2 input/output is multiplexed with RB3
#pragma config STVREN = ON // Stack full/underflow will cause Reset
#pragma config LVP = OFF // Single-Supply ICSP disabled
#pragma config XINST = OFF // Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
#pragma config DEBUG = OFF // Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins

#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF


usb_config.h

#ifndef USB_CONFIG_H
#define USB_CONFIG_H

#define USB_SUPPORT_DEVICE
#define USB_PING_PONG_MODE USB_PING_PONG__FULL_PING_PONG
#define USB_MAX_EP_NUMBER (4) // *

#define USB_MAX_NUM_INT (3) // *
#define USB_EP0_BUFF_SIZE (8)
#define USB_PULLUP_OPTION USB_PULLUP_ENABLE
#define USB_TRANSCEIVER_OPTION USB_INTERNAL_TRANSCEIVER
#define USB_SPEED_OPTION USB_FULL_SPEED
#define USB_NUM_STRING_DESCRIPTORS (3) //*

#define USB_POLLING

#endif // USB_CONFIG_H


HardwareProfile.h

#ifndef HARDWARE_PROFILE_H
#define HARDWARE_PROFILE_H

#define self_power (1)
#define USB_BUS_SENSE (1)

#endif //HARDWARE_PROFILE_H


���ꂪ����̊�‚ł��B����‚�����Ă����������̗p���܂������A�����p�^�[���ł̔z�����撣�낤�Ƃ͂����A�P��1�‚̃����h�ɕ����̌�������悤�ȏ�Ԃ𕔕i�̑��̕t�߂ɍ��A���̃����h�Ԃ�햌���ł‚Ȃ��悤�Ȕ��z�ō��܂����B

IMG_0311.JPG

���ꂪ���ʂł��B�����c

IMG_0312.JPG

����‚����Ă݂Ă킩�����̂́A�����h�͑傫�����Ă͂����Ȃ��Ƃ������Ƃł��B���̊�‚�GND�d�ʂ̕����͂������҂낢����ɂȂ��Ă��邱�Ƃ������̂ł����A���̕���̐^�񒆂Ɍ��������ĕ��i�̑���ʂ��Ĕ��c�t��������Ɣ��ɔ��c�t��������B�����炭�M���l���ɓ����邽�߂��Ǝv���܂��B�Ȃ̂ł��������ꍇ���@���@�����������`�̍a�����̎��͂ɓ���Ĕ����ɂ����ق��������悤�ł��B

�P�[�X�ɂ����܂�悤�ɂ��܂����B

IMG_0313.JPG

DIN�W���b�N�̑傫���̌����Y��ɂ�������@�͍��Ȃ��ۑ�ł��B�莝���̃��[�}�[�ōL������傫���𒴂��Ă���̂ŃJ�b�^�[�ł���ɍL���܂�����������Ƒȉ~�`�ɂȂ��Ă��܂��B

IMG_0314.JPG

�P�[�X�ɂ�L���^����Ƃ˂��ŌŒ肵�܂����B�˂��̎莝��������Ȃ��̂�2�����݂̂Ƃ߂Ă��܂����B

IMG_0315.JPG
posted by picmidi at 13:10| Comment(16) | ���L | ̃uO̓ǎ҂ɂȂ | XV`FbN
���̋L���ւ̃R�����g
���̃C���^�[�t�F�[�X���e�ɋ���������̂ł����A�p�������Ȃ���ǂ̂悤�ȗp�r�Ɏg�p����̂������Ă��������Bm(__)m
Posted by yossy at 2011�N03��09�� 09:49
�����DTM�Ƃ��Ɏg��������uMIDI�C���^�[�t�F�C�X�v�ł��B���̂悤�Ȑ��i�ɑ���������̂ł��B
http://www.roland.co.jp/products/jp/UM-1G/

��ڂ�MIDI�[�q���������d�q�y���PC���‚Ȃ��œd�q�y��̉��t����PC�Ɏ����ꂽ��PC����d�q�y����R���g���[�������肷�邱�Ƃł��B
Posted by picmidi at 2011�N03��10�� 08:15
�������񓚂����������肪�Ƃ��������܂����B
�Q�l�ɂ����Ă��������܂��B
Posted by yossy at 2011�N03��11�� 10:06
����ɂ��́B
�\�[�X���Q�l�ɂ����Ē����܂����B
���o�[�W������usb�t���[�����[�N��main.c�̃R�[�h�������悹�ăR���p�C�����Ă݂܂����B
���쌟�؂͂܂��ł����A���΂炵���ł��ˁI

�O�l����̃R�[�h�����‚��܂������A�Z���u���ŏ�����Ă��ē��e��c���ł��܂���B
���ꂩ��A�\�[�X��ǂ�ŕ׋������Ē��������Ǝv���Ă��܂��B
Posted by taka at 2011�N08��04�� 20:53
�Q�l�ɂȂ�΍K���ł��B�\�[�X�R�[�h�̂ق��͊�‚قǂ͉����Ȃ����Ǝv���̂Łc
Posted by picmidi at 2011�N08��14�� 17:13
����Ă݂܂����B�΂����蓮���Ă��܂��B
GM���Z�b�g(GM�V�X�e���I��)���ʂ�Ȃ��̂Œ��ׂ����ʁA���Ȃ��Ă�SysEx��64�o�C�g��
�l�܂��đ����Ă���݂����Ȃ̂ŁA�S����荞�ނ悤�ɂ��܂����B
���Ƃ�In/Out�Ƃ��ɁASysEx���ʂ�悤�ɂ��A�ŏI�I��OUT�|�[�g���ЂƂ‘��₵�āA
1in/2out�ɂĊ������܂����B�i���W�b�N���{���ɍ����Ă��邩������Ɖ�����^^�j
Posted by sunfish at 2012�N03��18�� 04:21
���ǂ��č���Ă���̂ł��ˁB�����Ă悩�����ł��B
Posted by picmidi at 2012�N03��22�� 20:42
�͂��߂܂��āB

YAMAHA�̃E�B���h�R���g���[���[WX7�p��MIDI-USB�ϊ��A�_�v�^����낤�ƍl���A
���߂�PIC�ɂ�鐧��Ƀ`�������W���Ă݂܂����B

PIC�́A�H����AE-PIC18F14K50�B
MIDI�@I/F�ɂ�TLP513���g�p�B
WX7��9V�̓d�����K�v�Ȃ��߁A�������H����DC-DC�R���o�[�^�[AE-ISL97519A���g�p�B
���̍\���łƂ肠�����n�[�h�E�F�A�͏o���オ��܂����B

PIC�͐G��̂����߂Ă����v���O���������������Ƃ��Ȃ��̂ŁA
MegaDrum MIDI Drum Trigger
http://www.megadrum.info/
������̃t�H�[����
Cheaper alternative to PIC18F2550
http://www.megadrum.info/forums/viewtopic.php?f=3&t=702
�Ƃ����̂�����܂��āA������18F14K50�p�̃\�[�X���������̂�
������Q�l�ɂ��Ă݂܂����B

PICKit3���w�����AMPLAB IDE���C���X�g�[���������̂́A�R���p�C�����ʂ炸�E�E�E
������̋L�����Q�l�Ƀp�X�̐ݒ�Ȃǂ��s���A�����Ƀ��C�N�ł��{�[�h�Ƀv���O�����𗬂����݂܂����B

WX7�ɂ‚Ȃ��O�ɕ��ʂ�MIDI�L�[�{�[�h�ɂ‚Ȃ����Ƃ���A������MIDI->USB�ϊ����o���Ă��܂����B�_(^o^)�^
����ŋC��ǂ�����WX7�ɂ‚Ȃ����Ƃ��듮�삪���������I�H(�G�ցG)
WX7�̓L�[�{�[�h�ƈ���đ��ŃR���g���[������悤�ɂȂ��Ă���A�u���X�R���g���[���Ƃ���CC���p�ɂɗ���Ă��܂����A��������܂��n���h�����O���Ă��Ȃ��悤�Ȃ̂ł��B

�������߂������Ƃ�PIC�̃v���O�����Ɋւ��Ă̓h�f�l�B�\�[�X�����Ă��ǂ����ǂ�����΂����̂��������‚��܂���B

�����ŁA������̃\�[�X���Q�l�ɂ����Ă����������Ǝv�����̂ł����A������̂�PIC18F2550�p�ł��ˁB
18F2550�p�̂��̂�18F14K50�p�ɏ���������ɂ͂ǂ̂悤�ɂ�����ǂ��������Ă��������܂���ł��傤���H
�ǂ����X�������肢�\�������܂��B
Posted by sasazo at 2012�N10��14�� 17:48
���[��A�Ƃ肠����Microchip��USB�t���[�����[�N�͓����Ă��܂���ˁB���̒���Device - Audio - MIDI�̃T���v����18F14K50�ł������悤�ɂȂ��Ă���̂ł�����r���h����18F14K50��USB MIDI�f�o�C�X�ɂ���iPC�Ńf�o�C�X�}�l�[�W���Ɍ����΂Ƃ肠����OK�j�Ƃ����̂���1�X�e�b�v�ł��ˁB
���Ƃ́c���̋L���̃R�[�h�����Ă͂܂�ꏊ�ɃR�s�[���Ēu��������΂Ȃ�Ƃ��Ȃ�C�����܂��B��G�c�Ȏw���ł��݂܂���B
�L���ł��G��Ă���z��p�������̔z�u�Ƃ���14K50�p�ɒ��������邩������܂���ˁB
Posted by picmidi at 2012�N10��15�� 22:40
�����̃R�����g���肪�Ƃ��������܂��B
�Ƃ肠�����AMegaDrum�̃\�[�X�̓r���h�o����
�H����14k50�{�[�h��MIDI->USB�̕ϊ��͏o���Ă��܂��B
�T���v���R�[�h���A�Ƃ肠�����r���h�͂��Ă݂܂����B�������18f2550�p�̃\�[�X���A�r���h�͂��Ă݂܂����B
���A14k50�p�Ƀ\�[�X�̏������������݂Ă��܂����A�|�[�g�ݒ�Ȃǂ����������Ȃ���΂Ȃ�Ȃ��ł����A�ǂ��������Ă��Ȃ��̂ŁE�E�E
�������}�b�v���Ⴄ�̂ŁA�o�b�t�@�̔z�u�����̂܂܂ł̓_���ł��ˁB
�w�K���Ȃ��班�����‚���Ă݂܂��B
�܂�������Ȃ����Ƃ�����܂�����A�X�������肢���܂��B
Posted by sasazo at 2012�N10��17�� 17:24
���L���ł��G��Ă���z��p�������̔z�u�Ƃ���14K50�p�ɒ��������邩������܂���ˁB

�m���ɁA���̕����ō����Ă��܂��B

18f14k50 �̏ꍇ�AMEMORY MAP ���ȉ��̗p�Ɏg���Ă���̂ł����A

DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1F3
DATABANK NAME=usb2 START=0x200 END=0x2FF PROTECTED
DATABANK NAME=sfr15 START=0xF40 END=0xF5F PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED

USB_VARIABLES 0x44
MIDI_IN_QUEUE 0xf8

���K�v�Ȃ悤�Ȃ̂ł����AMIDI_IN_QUEUE 0xf8���m�ۂ���ꏊ���Ƃ�܂���B
0x200�����USB_BDT���m�ۂ��Ă��܂��Ďg�킹�Ă���Ȃ����E�E�E

�����������ꍇ�A�ǂ̂悤�ɂ���Ηǂ��̂ł��傤���H
Posted by sasazo at 2012�N10��18�� 03:54
#define QUEUE_SIZE (58)
�ƕς��āA
#pragma udata MIDI_IN_QUEUE=0x100
�͂ǂ��ł��傤���H

���n�m�F���Ă��Ȃ��̂Ŗ��ʂȃA�h�o�C�X���Ă��܂���������܂��񂯂ǂ��݂܂���B
Posted by picmidi at 2012�N10��18�� 23:55
pcmidi����A�A�h�o�C�X���肪�Ƃ��������܂����B

���A�l�ŁA�Ȃ�Ƃ�18f14k50�œ��삳���邱�Ƃ��o���܂����B

pic18f14k50�̕W���������}�b�v�ł��ƁA
grp0 0x060�`0x0FF
grp1 0x100�`0x1FF
usb2 0x200�`0x2FF
�ƂȂ��Ă���A���̓�
stack��0x100�`0x1FF
USB_BDT��0x200�`0x24F
���L���Ă��܂��܂��B

���̂܂܂̃������}�b�v�ł��ƁA�ǂ�����Ă�
DataBuffer�AMIDI_QUEUE�ɕK�v�ȃG���A���m�ۂł��܂���B

�����ŁA�ݒ��ς���
stack��0x060�`0x09F
0x100�`��MIDI_QUEUE��
���Ă��Ă݂܂������A����ł�QUEUE_SIZE(32)���x�ɂ���̂�����Ƃł����B

���̑��A18f2550��18f14k50�̒�`������ς����肵�����ʁA
�����WX7�̏o�͂�USB�ɕϊ����‚点�邱�Ƃ��ł���悤�ɂȂ�܂����B

���́AMIDI In��dw�f�[�^�ŁAMIDI Out��byte�f�[�^�ɂȂ��Ă���̂��H
����MegaDrum�̃\�[�X���ƁA���Ղ����MIDI�f�[�^�͖‚点�āAWX7����͂��܂������Ȃ������̂��H
�ȂǁA�^��ȓ_������������܂����A�Ƃ肠�����‚点�����Ƃ͊������ł��B

�n�[�h�E�F�A�̓u���b�h�{�[�h��Ŏ���Ȃǂ����A�����Ȃ���グ���̂ŁA
���߂̓n�[�h�E�F�A�̖�肩�\�t�g�E�F�A�̖�肩���킩��Ȃ���Ԃł������A
���ǃn�[�h�E�F�A�̕��͈ꔭ�Ŋ������Ă��܂����B

����A���Ԃ������ă\�[�X�̗���������悤�ɂ��Ă݂܂��B
�܂�����Ȃǂ������Ē�����������܂��񂪁A���̐߂͋X�������肢���܂��B
Posted by sasazo at 2012�N10��21�� 17:20
�悩�����ł��B
Posted by picmidi at 2012�N10��21�� 20:22
����ɂ��́B�{���ɂ��Ȃ��̃v���W�F�N�gMIDI PIC18F2550���D���������B�Z�C�F1�j����R�[�h��������Ă���H2�j�R�[�h���������߂ɂǂ̃v���O�����H3�j�ǂ̂悤��Windows��MIDI�C���^�[�t�F�[�X�����Ă���H���zCOM�|�[�g�A�܂���MIDI-PORT�Ƃ��āH4�j���Ȃ��͎��̓d�q���[��[email protected]�����t�@�[���E�F�A�Z�p�𑗂��Ă��������܂��񂩁H...���O�̂������Łi���͎����R�[�h���R���p�C�����邽�߂̃v���O���~���O�̏��S�҂ƃn�[�h���j�B���̓��V�A���痈���񂾁A�i�����|��҂��g�p���܂��j���̌�������l�ѐ\���グ�܂��B
Posted by �A���N�T���_�[ at 2015�N03��19�� 05:39
���݂܂���
��H�}���悭�����Ȃ��̂�
���ꂢ�ȉ掿�̂��̂���������
Posted by at 2016�N12��22�� 21:17
�R�����g������
�����O:

���[���A�h���X:

�z�[���y�[�W�A�h���X:

�R�����g:

�F�؃R�[�h: [�K�{����]


���摜�̒��̕����𔼊p�œ��͂��Ă��������B