Trợ giúp với thuật toán điều chỉnh cao độ dao động bằng LFO


8

Tôi đang phát triển một phần mềm mô phỏng của một bộ tổng hợp tương tự. Tôi đang cố gắng điều chỉnh cao độ của bộ tạo dao động bằng LFO. Đối với mỗi mẫu được đưa vào hệ thống âm thanh của máy tính, tôi đang tính tần số được đưa vào bộ tạo dao động chính như thế này (mã giả):

osc_frequency = note_frequency * (1 + tuning) * (1 + lfo_y * lfo_mod_depth)

Các biến trong tuyên bố này được mô tả như sau:

  • note_frequency = tần suất ghi chú được phát bằng Hz
  • tinh chỉnh = bộ điều chỉnh dao động tinh chỉnh theo phần trăm của sân đã phát (ví dụ: -0,02 = giảm 2%)
  • lfo_y = giá trị y hiện tại của dạng sóng lfo (nằm trong khoảng từ -1 đến 1)
  • lfo_mod_depth = độ sâu / cường độ hiệu ứng để áp dụng cho bộ tạo dao động theo phần trăm

Tuy nhiên, tính toán này không mang lại kết quả mong muốn. Tôi mong đợi được nghe âm vực điều chỉnh lên xuống, bị khóa xung quanh tần số trung tâm (lưu ý đang được phát). Những gì tôi nhận được là một hiệu ứng điều chế làm cho sân "chạy trốn"; Tôi không thể nói chính xác những gì đang xảy ra, nhưng có vẻ như một trong những điều sau:

  1. Cường độ điều chế tăng theo thời gian (dấu tần số cao / thấp đạt được của điều chế tăng cao hơn / thấp hơn khi ghi chú được giữ lâu hơn)
  2. Trong khi cường độ điều chế không đổi theo thời gian, tần số trung tâm tăng trong khi điều chế dao động xung quanh nó

Tôi có đang sử dụng phương pháp đúng hay không? Nếu không, cách tiếp cận đúng phải là gì? Bất kỳ trợ giúp với điều này được nhiều đánh giá cao.


2
Điều quan trọng nhất là những gì bạn làm với tần số dao động mong muốn. Bạn có thể gặp vấn đề tương tự với câu hỏi này . Bạn nên có bộ tích lũy theo dõi pha của tín hiệu đầu ra ở mỗi bước thời gian, cập nhật nó theo tần số mong muốn ở mỗi mẫu đầu ra. Thêm thông tin có thể được tìm thấy ở đây .
Jason R

Việc bạn tham khảo một bộ tích lũy pha đã khiến tôi xem xét việc sử dụng tổng hợp có thể bỏ qua thay vì cách tiếp cận ngây thơ hơn mà tôi đang sử dụng trong bộ tạo dao động của mình. Khi tôi làm lại thiết kế của mình (cũng kết hợp các mẹo được nêu trong câu trả lời của @pichenettes), tôi đã nhận được kết quả mà tôi đang tìm kiếm. Cảm ơn!
Gary DeReese

Câu trả lời:


7

Như Jason đã nói, điều này có thể đơn giản là bạn không thực hiện chính xác bộ dao động của mình - ví dụ bằng cách nhân tần số theo thời gian thay vì tích hợp nó.

Cũng lưu ý - và điều này không liên quan đến chủ đề của bạn nhưng thực sự đáng để quan sát - rằng công thức điều chế tần số của bạn thực hiện một hành vi rất khác với hầu hết các nhạc cụ tổng hợp, và sẽ nghe có vẻ kỳ lạ đối với một nhạc sĩ.

Ví dụ: nếu lfo_y dao động trong khoảng -1 đến 1; lfo_mod_depth là 0,5; và nếu note_frequency bằng 220 Hz, osc_frequency sẽ quét trong khoảng từ 110 đến 330 - nghĩa là giữa -1 quãng tám và +1 thứ năm xung quanh nốt nhạc. Vì vậy, điều chế cao độ sẽ xuất hiện tập trung ở thang hertz, nhưng sẽ không tập trung ở thang âm nhạc cảm nhận.

Hành vi đúng là có một cái gì đó như:

osc_frequency = note_frequency * 2 ** (tuning / 1200.0 + lfo_y * lfo_mod_depth)

Sau đó:

  • điều chỉnh được thể hiện bằng xu , một đơn vị liên quan đến âm nhạc (100 xu = 1 nửa cung).
  • điều chế cao độ của bạn là "tập trung vào âm nhạc" và lfo_mod_depth được thể hiện bằng quãng tám .

Đây được gọi là "FM theo cấp số nhân" và đây là tiêu chuẩn về tổng hợp. Trên các bộ tổng hợp tương tự, điều này được thực hiện bằng cách gộp tín hiệu LFO vào CV đánh vào bộ chuyển đổi theo cấp số nhân của VCO. Trên các bộ tổng hợp kỹ thuật số, điều này được thực hiện bằng cách áp dụng các điều chế trên biểu diễn bên trong có độ phân giải cao vẫn còn trên thang âm nhạc - trước khi chuyển đổi sang tần số hoặc tăng pha.


Cảm ơn. Mặc dù đây không phải là vấn đề cốt lõi của tôi, nhưng đây thực sự là một cách hợp lý hơn để thể hiện và tính toán tần số dao động cho ứng dụng của tôi, và sau khi thực hiện nó, dường như hoạt động tốt.
Gary DeReese
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.