2012-06-01 6 views
5

나는 C에서 수학적 웨이브 함수를 사용하여 사운드를 생성 해왔다. 프로젝트의 다음 단계는 웨이브를 다른 것으로 변조하기 위해 MIDI 키보드 컨트롤러에서 사용자 입력을 얻는 것이다. 피치.C 리눅스 디바이스 프로그래밍 - 똑바로/Dev에서 읽기

첫 번째 개념은 상대적으로 간단하며 리눅스가 리눅스이기 때문에 다른 파일처럼 원시 데이터 스트림을 장치에서 읽을 수 있다는 것이 었습니다.

그러나 연구 결과에 따르면 MIDI 컨트롤러 용 장치 드라이버를 작성하는 것이 압도적으로 권고됩니다. 일반적인 생각은 장치 파일이있을지라도 커널은 응용 프로그램이 read() 및 write()와 같은 함수를 호출 할 때 실행할 시스템 호출을 알 수 없습니다.

이러한 경고에도 불구하고 실험을 수행했습니다. MIDI 컨트롤러를 연결하고 cat'ed/dev/midi1 "장치 파일. 꾸준한 Null 문자 스트림이 나타 났고, MIDI 컨트롤러에서 키를 눌렀을 때 MIDI 장치가 출력해야하는 예상 메시지 청크에 해당하는 여러 바이트가 나타났습니다.

MIDI Protocol Info 그래서 제 질문은 다음과 같습니다

왜 cat'ed 스트림은이 방식으로 작동 하는가?

내 시스템에 플러그 앤 플레이 장치 드라이버가 이미 설치되어 있다는 의미입니까?

계속해서 장치 드라이버를 작성해야합니까, 아니면 파일처럼 읽을 수 있습니까?

이 영역에서 지혜를 공유해 주셔서 감사합니다.

+0

대신 'C'프로그램에서 장치를 읽는 것이 좋습니다(). '유효한'데이터를보고 있다고 말하면 확실하지 않은 이유는 무엇입니까? btw, 이미 거기에 장치 드라이버가 있어야합니다. 그렇지 않으면 장치 파일이 없으며 액세스 할 수있는 방법이 없습니다. – KevinDTimm

답변

5

cat'ed 스트림이 이런 식으로 작동하는 이유는 무엇입니까?

아마도 컨트롤러가 수신중인 원시 MIDI 데이터 때문입니다. null 바이트는 일종의 동기화 틱일 수 있습니다.

내 시스템에 플러그 앤 플레이 장치 드라이버가 이미 설치되어 있다는 의미입니까?

예.

그러나 연구 결과에 따르면 MIDI 컨트롤러 용 장치 드라이버를 작성하는 것이 압도적으로 권고됩니다. 일반적인 생각은 장치 파일이있을지라도 커널은 응용 프로그램이 read() 및 write()와 같은 함수를 호출 할 때 실행할 시스템 호출을 알 수 없습니다.

< ...>

난 아직도 가서 장치 드라이버를 작성, 아니면 파일처럼 읽는 멀리 얻을 수 있습니다할까요?

나는 당신이 무엇을 읽고 있는지, 어떻게 결론에 도달했는지 모르겠다. :) 이미 MIDI 컨트롤러에 완벽하게 좋은 드라이버가 설치되어있어 사용하십시오!

2

정말로 NUL 바이트입니까? 그리고 0xf8 바이트가 아닌가요? 0xf8은 MIDI 타임 틱 상태이기 때문에 보통 계측기를 동기화 상태로 유지하기 위해 주기적으로 전송됩니다.od를 사용하여 장치를 읽어보십시오 :

od -vtx1 /dev/midi1 

당신이 0xf8의 무리를보고하는 경우, 그것은 괜찮습니다. 미디 콘트롤러에서 보낸 템포 정보가 필요하지 않다면 콘트롤러에서 무효로하거나 그 0xf8 상태 바이트를 무시하십시오.

또한 MIDI의 경우 현재 MIDI 상태가 보통 (바이트 저장)으로 전송 된 다음 필요에 따라 페이로드 바이트가 이어지는 것을 명심하십시오. 예를 들어, 피치 밴드 상태는 바이트 0xeK (K는 채널 번호, 즉 0 내지 15)이고 페이로드는 최하위 바이트의 7 비트 다음에 최상위 바이트의 7 비트이다. 따라서 어쩌면 이상한 컨트롤러가 있고 반복적 인 상태의 페이로드 만보고있을 수도 있지만 바보가 아닌 컨트롤러는 필요하지 않은 작업을 반복하지 않습니다.

이제 드라이버를 찾으십시오. MIDI 컨트롤러를 연결할 때 dmesg을 살펴보십시오. 이제 OSS /dev/midi1으로 표시되면 장치를 꽂을 때 (udev가이 작업을 수행 할 때) dmesg은 아무런 오류도 내지 않으므로 다른 것이 필요하지 않습니다. MIDI 프로토콜은 고정 된 전송 속도를 갖고 바이트를 전송/수신하는 또 다른 직렬 프로토콜입니다. 그것에 대해 복잡한 것은 없습니다 ... 그냥 장치에서 읽거나 장치에 쓰면 완료됩니다.

유일한 문제는 오디오 대기 시간이 좋지 않을 수 있다는 것입니다 (MIDI 명령을 사용하여 라이브 오디오를 제어하는 ​​경우, 내가하는 일이라고 생각합니다). 예를 들어, 신디사이저 용 패치/프리셋을 온라인으로 다운로드하고 MIDI를 사용하여 장치에 업로드하는 것과 같이, 해당 장치가 주로 시스템 전용 메시지로 작성된 것 같습니다. 이 상황에서는 대기 시간이 중요하지 않습니다.

또한 Linux에서 MIDI로 재생하는 ALSA way을 살펴보십시오.

1

새로운 MIDI 컨트롤러 하드웨어를 개발하지 않는 경우 드라이버 작성에 대해 걱정할 필요가 없습니다. 사용자의 하드웨어 설치 및 공급 업체의 드라이버 제공 의무입니다.

Linux에서는 파일을 읽었을뿐입니다. 이제 데이터를 해석하고 유용한 것들을 만드십시오.

관련 문제