Sfxr được làm như thế nào?


7

Tôi cho rằng đây là một câu hỏi Phát triển Trò chơi vì đây là một công cụ tạo âm thanh được tạo riêng cho các trò chơi (đặc biệt là các trò chơi Ludum Dare).

Tôi có một sự hiểu biết cơ bản về cách thức âm thanh hoạt động, với biên độ thay đổi gây ra những thay đổi về áp suất để tạo ra âm thanh. Điều tôi băn khoăn là cách bạn tạo ra âm thanh thông qua lập trình, và cụ thể hơn là cách sfxr thực hiện nó. Cách tiếp cận của tôi sẽ là có một mảng các giá trị đại diện cho từng biên độ và sau đó một số cách gửi nó đến các loa. Nhưng làm thế nào để bạn làm điều đó? Có thư viện mà sfxr sử dụng không?


2
Bạn có biết nó là nguồn mở phải không? Đây là một cổng XNA của nó: xnasfxrsynth.codeplex.com
zfedoran

Tôi nhận thấy anh ta đã nói rằng bạn có thể lấy mã nguồn, nhưng mã gốc ở đâu? Tôi nhanh chóng liếc qua liên kết sfxr-sdl-1.1.tar.gz anh ta có ở đó, nhưng không thể tìm thấy các bit âm thanh. Tôi sẽ xem xét kỹ hơn về nó sau này, cũng như liên kết đến XNA (điều này thực sự hữu ích. Tôi không biết bạn có thể kiểm soát được âm thanh trong XNA như thế nào. Cảm ơn!)
Jeff

Câu trả lời:


7

Chà, bạn thường không phải đi ở mức độ thấp và vận chuyển dữ liệu âm thanh đến loa. Hệ điều hành có giao diện cho điều đó (có thể là ALSA , DirectSound , CoreAudio , v.v.). Sử dụng thư viện đó, bạn chỉ cần định kỳ cung cấp cho nó một khối các mẫu có độ dài cố định (ví dụ: 512 mẫu). Thư viện âm thanh lưu trữ mảng đó trong bộ đệm nội bộ và phát nó.

Ví dụ: nếu khối của bạn dài 512 mẫu và tần suất lấy mẫu là 44.1Khz, điều này có nghĩa là bạn có 512/44100 = 11 mili giây để tạo khối 512 mẫu tiếp theo. Nếu bạn mất nhiều thời gian hơn để cập nhật, thông thường khối cũ sẽ được phát lại lần nữa (âm thanh không dừng lại). Nghe có vẻ như một đĩa CD bị hỏng, rất khó chịu. Bạn không muốn điều đó. Tôi đoán những gì sfxr làm là lưu trữ toàn bộ sóng và chỉ sao chép đoạn dữ liệu có liên quan vào bộ nhớ, hoạt động đó hầu như không có gì.

Trên hết, có những thư viện khác cung cấp API trừu tượng và "nói chuyện" với kiến ​​trúc âm thanh của hệ điều hành. Bằng cách này, bạn có thể dễ dàng viết các ứng dụng đa nền tảng mà không phải điều chỉnh mã âm thanh của mình cho từng hệ thống. Ví dụ về chúng là fmod , OpenAL , SDL , PortAudiovân vân dài.

Cập nhật :

sfxr sử dụng PortAudio cho phiên bản Windows và SDL cho các nền tảng khác. Nếu bạn nhìn vào phần cuối của main.cpp , bạn sẽ thấy các công cụ này được khởi tạo như thế nào. PortAudio được truyền con trỏ tới một chức năng gọi là AudioCallback và SDL được chuyển một con trỏ tới SDLAudioCallback . Bạn có thể thấy rằng những gì các chức năng này làm là xử lý một khối 512 mẫu và sao chép nó vào bộ đệm đầu ra. Việc xử lý được thực hiện trong một hàm khá phức tạp gọi là SynthSample , đây là hàm tạo ra các mẫu đầu ra mong muốn cho một khối được cung cấp tất cả các tham số bên trong của bộ tổng hợp sfxr.


Cảm ơn, đó chính xác là những gì tôi đang tìm kiếm! Tôi tự hỏi tại sao không sử dụng PortAudio hoặc SDL cho cả hai? Trong các bình luận có ghi "công cụ portaudio cổ đại" trước khi định nghĩa nó cho win32. Nhưng cả SDL và PortAudio đều không phải là nền tảng chéo?
Jeff

5

Tôi bắt đầu viết câu trả lời này, và nó ngày càng dài hơn, vì vậy đây sẽ là câu trả lời dài dòng, vì vậy hãy lấy từ nó những gì bạn sẽ làm. Giống như CeeJay đã nói, bạn không cần phải lo lắng về những thứ này thường. Đặc biệt là nếu bạn có thể sử dụng API như FMOD, Wwise hoặc XACT cho phép nhà thiết kế âm thanh của bạn tự kết nối mọi thứ để bạn không nói "play this.wav" mà thay vào đó "kích hoạt sự kiện 'PlayExplumpingSound'" có một thời gian dễ dàng hơn nhiều để tích hợp âm thanh vào trò chơi của bạn.


SFXR hoạt động bằng cách xây dựng một số trình tạo âm thanh cơ bản và cung cấp các tham số bạn nhìn thấy trong GUI. Cả XNA và ActionScript 3 gần đây đã cung cấp một cách để truyền trực tiếp các mẫu vào công cụ trộn cơ bản đang hoạt động. XNA đã có thể xác định bộ đệm mẫu tĩnh (có vẻ như XNASfxrSynth sử dụng cái này), nhưng bây giờ bạn có thể có một DynamicSoundEffectInstance kích hoạt một sự kiện yêu cầu bạn cung cấp cho nó bộ đệm mẫu. Điều này làm giảm đáng kể dung lượng bộ nhớ của bạn cho các tín hiệu âm thanh được tạo liên tục. Về mặt kỹ thuật, bạn cũng có thể viết công cụ trộn của riêng mình, chỉ cần có một phiên bản âm thanh chính duy nhất mà tất cả các bộ đệm mẫu của bạn được gửi để trộn.

Có thể tìm thấy một ví dụ chung về việc tạo bộ tạo sóng hình sin trong tài liệu của Adobe cho sự kiện sampleDataEvent mới của họ trong lớp Âm thanh. Nó thực sự chỉ là về cách thức âm thanh kỹ thuật số hoạt động và xây dựng bộ đệm mẫu chính xác để có được âm thanh bạn muốn. Ngoài ra, hãy xem trang web của Andre Michelle để xử lý âm thanh tiên tiến tuyệt vời hơn trong Flash.

Giống như CeeJay đã nói, dữ liệu âm thanh thường có tần số lấy mẫu liên quan (thường là 44,1kHz hoặc 48kHz - Battlefield Bad Company sử dụng 48 để đạt được độ phát lại độ trung thực cao khi bạn có hệ thống 5.1 tốt được nối). Khi làm việc với âm thanh kỹ thuật số, bạn phải lo lắng về một thứ gọi là tần số Nyquist. Về cơ bản, tần số cao nhất bạn có thể biểu thị trong tín hiệu âm thanh là một nửa tần số lấy mẫu của bạn. Lý do tại sao 44,1kHz và 48kHz là tần số lấy mẫu phổ biến nhất là phạm vi nghe của con người là khoảng 0 đến 20kHz. Do đó, 44,1kHz và 48kHz thực hiện công việc khá tốt trong việc tái tạo âm thanh có độ trung thực cao trên hầu hết các hệ thống của người tiêu dùng.

Nó cũng có một chút độ sâu, thường là 16 cho hỗn hợp cuối cùng. Điều này có nghĩa là bạn có 16 bit để biểu thị biên độ của từng mẫu, -32768 đến 32767. Điều này có nghĩa là có dải âm lượng 96 dB để hoạt động. Giới hạn cường độ tiêu chuẩn cho âm thanh trong rạp chiếu phim là 85 dB SPL (bit SPL là cách để chuẩn hóa âm lượng, vì hệ thống decibel là tương đối), do đó 16 bit hoạt động thực sự tốt cho bản phối cuối cùng trên hầu hết các hệ thống của người tiêu dùng.

Thông thường, một trò chơi sẽ thực hiện một số pha trộn nội bộ bằng cách sử dụng các giá trị dấu phẩy động 32 bit và sau đó chuyển đổi thành 16 bit trước khi đẩy vào card âm thanh. Lý do cho điều này là cùng một lý do bạn sẽ ghi lại trong 24 bit với tần số lấy mẫu 96kHz. Khi bạn bắt đầu thao tác âm thanh, bạn muốn có nhiều khoảng trống nhất có thể. Hiệu ứng âm thanh kỹ thuật số đôi khi có thể đưa ra các tín hiệu tần số cao mới thú vị, sau đó được điều khiển tiếp tục xuống chuỗi tín hiệu và có ảnh hưởng đến đầu ra cuối cùng. Chúng có thể bị cắt khi bạn trộn xuống 16 bit, 48 / 44.1k, nhưng bạn sẽ bảo toàn tất cả dữ liệu trên đường đi. Nó giống như giữ một bản sao của tệp .PSD có độ phân giải cao của bạn vừa được tái xuất mỗi khi bạn cần thay đổi một tài sản nghệ thuật. Ngoại trừ điều này là tất cả xảy ra trong thời gian thực trong công cụ âm thanh.

Nếu bạn muốn đọc thêm về các khái niệm cấp thấp hơn về lập trình âm thanh, tôi khuyên bạn nên xem cuốn Sách lập trình âm thanh của Richard Boulanger & Victor Lazzarini. Tôi mới nhận được bản sao của mình vài tuần trước và nó rất hữu ích trong việc giúp bạn dễ dàng hiểu các khái niệm về lập trình âm thanh (chương C giới thiệu là một sự tẻ nhạt mặc dù có những khái niệm quan trọng trong đó bạn không thể bỏ lỡ, nhưng bạn cũng vậy phải ngồi giải thích về số học con trỏ).

Một cuốn sách hay khác là Ai là Fourier? . Nó giả định nền tảng toán học nhỏ và bao gồm những điều cơ bản của biến đổi Fourier và lý thuyết sóng nói chung trong bối cảnh các nhà nghiên cứu ngôn ngữ đang cố gắng nghiên cứu các mẫu bài phát biểu. Loại này có sách giáo khoa tiếng Nhật giới thiệu trẻ em với các nhân vật vẽ tay dễ thương, nhưng đồng thời nó nói về số tiền Riemann trong chương thứ hai.


Tôi đã có một sự quen thuộc cơ bản với tần số Nyquist và một số cách hiểu biến đổi Fourier. Tôi quan tâm nhiều hơn đến cách bạn thực sự gửi về nói một mẫu mà bạn đã thực hiện với loa. Các liên kết bạn đã đăng trông rất thú vị, tôi đặc biệt thích nhận được Sách lập trình âm thanh đó, cảm ơn!
Jeff
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.