2012-06-01 17 views
5

Tôi đã chơi bằng cách tạo âm thanh bằng cách sử dụng các hàm sóng toán học trong C. Bước tiếp theo trong dự án của tôi là nhận đầu vào của người dùng từ bộ điều khiển bàn phím MIDI để điều chỉnh sóng khác quảng cáo chiêu hàng.Lập trình thiết bị Linux - Đọc trực tiếp từ/Dev

Khái niệm đầu tiên của tôi là điều này tương đối đơn giản và Linux, là Linux, sẽ cho phép tôi đọc luồng dữ liệu thô từ thiết bị của mình giống như bất kỳ tệp nào khác.

Tuy nhiên, nghiên cứu áp đảo khuyên rằng tôi viết trình điều khiển thiết bị cho bộ điều khiển MIDI. Ý tưởng chung là mặc dù các tập tin thiết bị có thể có mặt, hạt nhân sẽ không biết những gì các cuộc gọi hệ thống để thực thi khi ứng dụng của tôi gọi các hàm như read() và write().

Bất chấp những cảnh báo này, tôi đã làm một thử nghiệm. Tôi cắm vào bộ điều khiển MIDI và đặt tên cho tập tin thiết bị "/ dev/midi1". Một dòng ổn định của các ký tự null xuất hiện, và khi tôi nhấn một phím trên bộ điều khiển MIDI một vài byte xuất hiện tương ứng với các khối thông báo dự kiến ​​mà một thiết bị MIDI sẽ xuất ra. MIDI Protocol Info

Vì vậy, câu hỏi của tôi là:

Tại sao dòng cat'ed cư xử theo cách này?

Điều này có nghĩa là có trình điều khiển thiết bị cắm và chạy đã được cài đặt trên hệ thống của tôi không?

Tôi có nên tiếp tục và viết trình điều khiển thiết bị hay tôi có thể đọc sách như một tệp không?

Cảm ơn bạn đã nâng cao để chia sẻ sự khôn ngoan của bạn trong các lĩnh vực này.

+0

thay vì sử dụng nó, tôi khuyên bạn nên đọc() thiết bị từ chương trình 'C'. Bạn nói rằng bạn đang nhìn thấy dữ liệu 'hợp lệ', tại sao không tìm ra chắc chắn? btw, phải có một trình điều khiển thiết bị ở đó, nếu không bạn sẽ không có một tập tin thiết bị, cũng không có cách nào để truy cập nó. – KevinDTimm

Trả lời

5

Tại sao luồng cat'ed hoạt động theo cách này?

Do đó có lẽ là dữ liệu MIDI thô đang được bộ điều khiển nhận. Các byte null có lẽ là một số loại đánh dấu đồng bộ.

Điều này có nghĩa là có trình điều khiển thiết bị cắm và chạy đã được cài đặt trên hệ thống của tôi không?

Có.

Tuy nhiên, nghiên cứu cho rằng tôi viết trình điều khiển thiết bị cho bộ điều khiển MIDI. Ý tưởng chung là mặc dù các tập tin thiết bị có thể có mặt, hạt nhân sẽ không biết những gì các cuộc gọi hệ thống để thực thi khi ứng dụng của tôi gọi các hàm như read() và write().

< ...>

nên tôi vẫn đi trước và viết một trình điều khiển thiết bị, hoặc tôi có thể nhận được ngay với đọc nó như một tập tin?

Tôi không chắc bạn đang đọc gì hoặc bạn đang đi đến kết luận này như thế nào, nhưng điều đó sai. :) Bạn đã có một trình điều khiển hoàn toàn tốt được cài đặt cho bộ điều khiển MIDI của bạn - hãy tiếp tục và sử dụng nó!

2

Bạn có chắc chắn đang đọc NUL byte không? Và không phải 0xf8 byte? Vì 0xf8 là trạng thái đánh dấu thời gian MIDI và thường được gửi định kỳ để giữ cho các nhạc cụ được đồng bộ hóa.Thử đọc thiết bị bằng cách sử dụng od:

od -vtx1 /dev/midi1 

Nếu bạn thấy một loạt 0xf8, không sao. Nếu bạn không cần thông tin tiến độ được gửi bởi bộ điều khiển MIDI của bạn, hãy tắt nó trên bộ điều khiển của bạn hoặc bỏ qua các byte trạng thái 0xf8 đó.

Ngoài ra, đối với MIDI, hãy nhớ rằng trạng thái MIDI hiện tại thường được gửi sau khi (để lưu trên byte) và sau đó tải trọng byte theo sau bao lâu nếu cần. Ví dụ, trạng thái uốn pitch là byte 0xeK (trong đó K là số kênh, nghĩa là 0 đến 15) và trọng tải của nó là 7 bit của byte ít quan trọng nhất theo sau là 7 bit của các byte quan trọng nhất. Vì vậy, có lẽ bạn có một bộ điều khiển lạ và bạn chỉ thấy các tải trọng lặp lại của một số trạng thái, nhưng bất kỳ bộ điều khiển nào không ngu ngốc sẽ không lặp lại những gì nó không cần.

Bây giờ cho trình điều khiển: hãy xem dmesg khi bạn cắm bộ điều khiển MIDI của mình. Bây giờ nếu OSS /dev/midi1xuất hiện khi bạn cắm thiết bị của mình (udev đang thực hiện công việc này) và dmesg không bắn bất kỳ lỗi nào, bạn không cần bất kỳ điều gì khác. Giao thức MIDI là một giao thức nối tiếp khác có một baudrate cố định và truyền/nhận byte. Không có gì phức tạp về điều đó ... chỉ cần đọc từ hoặc ghi vào thiết bị và bạn đã hoàn thành.

Vấn đề duy nhất là xếp hàng ở một số nơi có thể dẫn đến độ trễ âm thanh kém (nếu bạn đang sử dụng lệnh MIDI để điều khiển âm thanh trực tiếp, điều tôi tin là những gì bạn đang làm). Có vẻ như những thiết bị này chủ yếu được tạo cho thông báo độc quyền của, ví dụ, tải xuống một số bản vá/cài đặt sẵn cho bộ tổng hợp trực tuyến và tải nó lên thiết bị bằng MIDI. Độ trễ không thực sự quan trọng trong tình huống này.

Ngoài ra, hãy xem ALSA way đang phát bằng MIDI trên Linux.

1

Nếu bạn không phát triển phần cứng bộ điều khiển MIDI mới, bạn không nên lo lắng về việc viết trình điều khiển cho phần cứng đó. Đó là mối quan tâm của người dùng cài đặt phần cứng của họ, và nghĩa vụ của nhà cung cấp để cung cấp các trình điều khiển.

Trong Linux, bạn chỉ cần đọc tệp. Bây giờ để giải thích và làm những điều hữu ích với dữ liệu.