2011-10-19 35 views
6

Những gì tôi muốn làm:Làm thế nào để chương trình một sequencer âm nhạc đơn giản dành cho Android (Java)

Tôi muốn chương trình một sequencer âm nhạc rất đơn giản dành cho Android. Nhưng tôi chưa bao giờ làm việc với âm thanh trên Android hoặc trong Java, tương ứng.

gì ứng dụng nên làm:

  • phát lại mẫu (WAVE/OGG)
  • chơi một số kênh âm thanh cùng một lúc (ví dụ như kèn và sáo nên chơi cùng một lúc, tối đa là 10 công cụ)
  • thay đổi độ cao của các mẫu (ví dụ file trumpet WAVE phải được chơi trong sân bình thường (c4) và dưới sân/cao (e2/g6) và vân vân)

Đây là những gì ứng dụng sẽ có thể thực hiện nói chung.

Tôi cần những thành phần nào? Trình phát phương tiện thông thường (AudioManager?) Sẽ không hoạt động, phải không?

Hiện đã có một số ứng dụng mà làm những gì tôi đang suy nghĩ về:

  • FingerBeat dành cho iOS
  • FL Studio Mobile dành cho iOS
  • Uloops Studio dành cho Android

Cảm ơn trước về sự giúp đỡ của bạn!

Trả lời

6

Có trình theo dõi đánh mã nguồn mở rất đơn giản dành cho Android được gọi là SoundFuse. Họ có mô tả và ảnh chụp màn hình trên trang.

Here là kho lưu trữ github.

+0

Cảm ơn bạn rất nhiều, dự án này là rất thú vị và có thể giúp tôi rất nhiều Tôi nghĩ :) – caw

2

Bạn không có một yêu cầu đơn giản, nhưng ba yêu cầu rất khác nhau.

  1. Chơi WAV cần được hỗ trợ ra khỏi hộp bằng JRE với sự giúp đỡ của các lớp trong javax.sound.sampled, nó jsut đòi hỏi một số mã để dây nó lên (không quá chắc chắn về android).

  2. Phát OGG không được hỗ trợ ngoài hộp. Có một triển khai mã nguồn mở cho OGG được gọi là jOrbis, xem web site của họ. Một lần nữa điều này có thể yêu cầu một số mã dây để móc vào ứng dụng của bạn.

  3. Đối với một Sequencer, bạn chỉ có thể sử dụng MIDI. Một lần nữa nó sẽ được hỗ trợ bởi JRE, và nếu nó không được trên nền tảng của bạn, bạn có thể sử dụng Gervill - một trình tự Java MIDI thuần túy (Project web site).

  4. Ngoài ra còn có một ModPlayer có thể chơi Soundtracker cũ tốt và một số người khác. Điều này cũng có thể bị lạm dụng như một Sequencer của một số loại nếu bạn biết định dạng mô-đun Soundtracker hoặc Screamtracker (định dạng cổ, nhưng mô tả vẫn có sẵn trên mạng). Người chơi có nguồn có thể được tìm thấy here. Các định dạng Tracker không phải là tất cả những gì cổ xưa bằng cách này, một số công cụ trò chơi todays vẫn sử dụng chúng.

  5. Nếu bạn thực sự muốn, bạn có thể tự nấu Sequencer của mình, tất cả những thứ cơ bản nếu có trong javax.sound.sampled. Nó chỉ đòi hỏi một số kiến ​​thức cơ bản về âm thanh kỹ thuật số và rất nhiều mã dây.

Không có giải pháp duy nhất cho tất cả nhu cầu của bạn, bạn sẽ phải khâu bạn sở hữu với nhau từ các khối xây dựng có sẵn miễn phí.

+0

Cảm ơn bạn rất nhiều cho cuộc khảo sát chi tiết này. Nhưng theo liên kết của Boude (http://developer.android.com/guide/appendix/media-formats.html), Android hỗ trợ OGG một cách tự nhiên. – caw

+0

Tôi không thực sự quen thuộc với các chi tiết trên Android, chỉ tóm tắt những gì tôi biết là có sẵn/cần thiết trên một JRE chuẩn. – Durandal

2

Tôi sẽ không thể cung cấp câu trả lời hoàn chỉnh, nhưng tôi sẽ chỉ cho bạn đúng hướng.

Android hỗ trợ giải mã .wav và .ogg. Theo: http://developer.android.com/guide/appendix/media-formats.html

Tôi không có kinh nghiệm về âm thanh, nhưng đặt cược tốt nhất của bạn có vẻ là lớp SoundPool, nó cho phép bạn điều chỉnh độ cao và âm lượng và dường như có thể phát nhiều âm thanh đồng thời: " Lưu ý rằng tính năng phát cuộc gọi() có thể khiến âm thanh khác ngừng phát nếu vượt quá số lượng luồng hoạt động tối đa. " http://developer.android.com/reference/android/media/SoundPool.html

Ngoài ra còn có lớp MediaPlayer, nhưng đây là cách sử dụng đơn giản hơn. Tôi không nghĩ nó cho phép điều khiển sân.

+0

Cảm ơn bạn rất nhiều, Boude, cuối cùng bạn đã thuyết phục tôi sử dụng lớp SoundPool :) – caw

2

Tôi đã tạo một cái gì đó tương tự cho ứng dụng của mình (phát mẫu trombones). Sau nhiều lần trải nghiệm, tôi thấy giải pháp tốt nhất là sử dụng AudioTrack. Hãy nhìn vào mã nguồn của tôi: http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino

Đặc biệt

http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/Trombone.java http://code.google.com/p/trombonino/source/browse/trunk/src/com/trombonino/WavFile. java

+0

Cảm ơn bạn, tôi sẽ xem xét mã của bạn và tôi chắc chắn rằng nó có thể giúp tôi. Bạn có thể giải thích lý do tại sao bạn không sử dụng SoundPool? Với tôi, lớp học này có vẻ là lớp phù hợp nhất. – caw

+0

Phiên bản đầu tiên của tôi đã sử dụng soundpool. Nhưng looping với soundpool tạo ra một "click" gây phiền nhiễu giữa mỗi vòng lặp (ít nhất là trên mong muốn của tôi và được báo cáo bởi một số người dùng) mà không được chấp nhận cho các mẫu âm nhạc. – gadjou

+0

Ngoài ra, với audiotrack, bạn có thể lặp trong tệp âm thanh thay vì lặp toàn bộ tệp (tốt hơn cho mẫu). Theo như tôi có thể nhớ, tôi cũng nhanh chóng chạy vào vấn đề bộ nhớ với soundpool, cũng với vài mẫu nhỏ. – gadjou

1

Bạn sẽ gặp sự cố với thời gian của mình trên hệ thống Android. Để tránh chuỗi trình tự của bạn bị gián đoạn bởi bộ sưu tập rác, bạn có thể cần phải viết trình tự sắp xếp theo kiểu gốc bằng cách sử dụng ndk.

Phát lại âm thanh có lẽ là tốt nhất để thực hiện việc sử dụng ndk.

Hãy xem https://code.google.com/p/high-performance-audio/

Ở phía trên Soundfuse dụ sequencer sử dụng SystemClock.sleep() mà không bao giờ là một ý tưởng tốt. Kiểm tra Why using System.Threading.Thread.Sleep() is a bad practice?.

Nhận ra câu hỏi này thực sự cũ nhưng sẽ trả lời câu hỏi này vì không có câu trả lời nào đề cập đến NDK.

Các vấn đề liên quan