Tô màu một dạng sóng với trung tâm quang phổ hoặc bằng các phương tiện khác


8

Cập nhật 8

Không hài lòng khi phải tải các bản nhạc lên dịch vụ và xem bản phát hành mới của RekordBox 3 Tôi đã quyết định xem xét lại cách tiếp cận ngoại tuyến và độ phân giải tốt hơn: D

Âm thanh đầy hứa hẹn mặc dù vẫn ở trạng thái rất alpha:

Johnick - Thời gian tốt

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Lưu ý rằng không có thang đo logarit cũng như điều chỉnh bảng màu, chỉ là ánh xạ thô từ tần số đến HSL.

Ý tưởng : bây giờ trình kết xuất dạng sóng có một nhà cung cấp màu được yêu cầu màu cho một vị trí cụ thể. Mẫu bạn đang thấy ở trên có tỷ lệ bắt chéo bằng 0 cho 1024 mẫu bên cạnh vị trí đó.

Rõ ràng vẫn còn nhiều việc phải làm trước khi có được thứ gì đó mạnh mẽ nhưng có vẻ như đó là một con đường tốt ...

Từ RekordBox 3 :

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Cập nhật 7

Hình thức cuối cùng mà tôi sẽ áp dụng, giống như trong Bản cập nhật 3

nhập mô tả hình ảnh ở đây

(đó là một chút Photoshop để có được sự chuyển tiếp mượt mà giữa các màu)

Kết luận là tôi đã đóng cách đây nhiều tháng nhưng không cho rằng kết quả đó là xấu X)

Cập nhật 6

Tôi đã khai quật dự án gần đây, vì vậy tôi nghĩ về việc cập nhật ở đây: D

Bài hát: Chic - Good Times 2001 (Câu lạc bộ Stonebridge)

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

IMO tốt hơn, nhịp đập có màu không đổi, v.v ... mặc dù vậy nó không được tối ưu hóa.

Làm sao ?

Vẫn với http://developer.echonest.com/docs/v4/_static/AnalyzeDocumentation.pdf (trang 6)

Đối với từng phân khúc:

public static int GetSegmentColorFromTimbre(Segment[] segments, Segment segment)
{
    var timbres = segment.Timbre;

    var avgLoudness = timbres[0];
    var avgLoudnesses = segments.Select(s => s.Timbre[0]).ToArray();
    double avgLoudnessNormalized = Normalize(avgLoudness, avgLoudnesses);

    var brightness = timbres[1];
    var brightnesses = segments.Select(s => s.Timbre[1]).ToArray();
    double brightnessNormalized = Normalize(brightness, brightnesses);

    ColorHSL hsl = new ColorHSL(brightnessNormalized, 1.0d, avgLoudnessNormalized);
    var i = hsl.ToInt32();
    return i;
}

public static double Normalize(double value, double[] values)
{
    var min = values.Min();
    var max = values.Max();
    return (value - min) / (max - min);
}

Rõ ràng là cần nhiều mã hơn trước khi bạn đến đây (tải lên dịch vụ, phân tích JSON, v.v.) nhưng đó không phải là điểm chính của trang web này vì vậy tôi chỉ đăng những nội dung có liên quan để nhận được kết quả trên.

Vì vậy, tôi đang sử dụng 2 chức năng đầu tiên của kết quả phân tích, chắc chắn còn nhiều việc phải làm nhưng tôi vẫn cần phải kiểm tra. Nếu tôi tìm thấy thứ gì đó hay hơn ở trên, tôi sẽ quay lại và cập nhật tại đây.

Như mọi khi, bất kỳ gợi ý về chủ đề này đều được chào đón nhiều hơn!

Cập nhật 5

Một số gradient sử dụng chuỗi hài

nhập mô tả hình ảnh ở đây

Làm mịn màu là tỷ lệ nhạy cảm nếu không nó trông xấu, sẽ cần một số điều chỉnh.

Cập nhật 4

Viết lại việc tô màu xảy ra tại nguồn và làm mịn màu bằng bộ lọc Alpha beta với các giá trị 0,08 và 0,02.

nhập mô tả hình ảnh ở đây

Tốt hơn một chút khi thu nhỏ

nhập mô tả hình ảnh ở đây

Bước tiếp theo là để có được một bảng màu tuyệt vời!

Cập nhật 3

nhập mô tả hình ảnh ở đây

Màu vàng tượng trưng cho phương tiện nhập mô tả hình ảnh ở đây

Không quá tuyệt vời khi chưa được khám phá, chưa. nhập mô tả hình ảnh ở đây

(bảng màu cần một số công việc nghiêm túc)

Cập nhật 2

Thử nghiệm sơ bộ bằng cách sử dụng gợi ý hệ số 'âm sắc' thứ hai từ pichenettes nhập mô tả hình ảnh ở đây

Cập nhật 1

Thử nghiệm sơ bộ sử dụng kết quả phân tích từ dịch vụ EchoNest , lưu ý rằng nó không được căn chỉnh tốt (lỗi của tôi) nhưng nó mạch lạc hơn nhiều so với phương pháp trên.

nhập mô tả hình ảnh ở đây

Đối với những người quan tâm đến việc sử dụng API tuyệt vời này, hãy bắt đầu tại đây: http://developer.echonest.com/docs/v4/track.html#profile

Ngoài ra, đừng nhầm lẫn bởi các dạng sóng này vì chúng đại diện cho 3 bài hát khác nhau.

Câu hỏi ban đầu

Cho đến nay, đây là kết quả tôi nhận được khi sử dụng FFT 256 mẫu và tính toán trọng tâm quang phổ của từng khối .

Kết quả thô của các tính toán nhập mô tả hình ảnh ở đây

Một số làm mịn được áp dụng (hình thức trông tốt hơn nhiều với nó) nhập mô tả hình ảnh ở đây

Dạng sóng được sản xuất nhập mô tả hình ảnh ở đây

Lý tưởng nhất, đây là cách nó sẽ trông như thế nào (lấy từ phần mềm Serato DJ ) nhập mô tả hình ảnh ở đây

Bạn có biết tôi có thể sử dụng kỹ thuật / thuật toán nào để có thể phân tách âm thanh khi tần số trung bình thay đổi theo thời gian không? (giống như hình trên)


1
Tôi nghĩ rằng bạn đang đi đúng hướng bằng cách sử dụng trung tâm quang phổ; có lẽ bạn chỉ cần một ánh xạ phi tuyến tính của kết quả để có được sự phân phối màu sắc tốt. Dường như chỉ có phân đoạn màu xanh / lục lam trong bảng màu của bạn hiện đang được sử dụng.
pichenettes

1
Là câu hỏi của bạn về thuật toán giả màu hoặc về việc chia âm thanh thành các khối theo cách tự động?
Bjorn Roche

@pichenettes: đúng, tôi sẽ giải quyết vấn đề này bằng thang đo logarit.
Aybe

1
Đây chính xác là những gì freesound.org sử dụng để tô màu cho dạng sóng của chúng. Xem của họspectral_centroid . Điều tôi thực sự muốn là ánh xạ phổ âm thanh lên phổ màu, vì vậy tần số thấp là màu đỏ, tần số cao là màu xanh lam, kết hợp cả hai là màu đỏ tươi, tần số trung bình là màu xanh lá cây, quét log là cầu vồng, tiếng ồn trắng là màu trắng, nhiễu hồng là hồng, nhiễu đỏ là đỏ, ... Tôi không thể tìm ra cách thực hiện, vì một phổ là tuyến tính và phổ kia là log. :) flic.kr/p/7S8oHA
endolith

1
@Aybe: Vâng, tôi biết cách làm cho bản ghi nhật ký trông giống như cầu vồng, nhưng khi được đo bằng khoảng cách tần số log (dải rộng tỷ lệ), nhiễu trắng có phổ nghiêng chứ không phải phổ phẳng, vì vậy nó sẽ không tạo ra ánh sáng trắng . Tên của chúng tôi cho màu sắc của nhiễu dựa trên các dải có chiều rộng không đổi (khoảng cách tuyến tính), nhưng nhận thức của chúng tôi về các tông màu nằm trên một khoảng cách nhật ký (các dải có chiều rộng tỷ lệ). Tôi có thể hỏi bạn dự định làm gì với điều này khi bạn làm cho nó hoạt động không?
endolith

Câu trả lời:


4

Bạn có thể thử đầu tiên sau đây (không phân khúc):

  • Xử lý tín hiệu theo từng phần nhỏ (thời lượng 10ms đến 50ms) - nếu cần thiết với sự chồng chéo 50% giữa chúng.
  • Tính toán trọng tâm quang phổ trên mỗi khối.
  • Áp dụng hàm phi tuyến tính cho giá trị trung tâm quang phổ để có được sự phân bố đồng đều của màu bảng màu được sử dụng. Logarit là một khởi đầu tốt. Một tùy chọn khác là trước tiên tính toán phân phối giá trị centroid khác toàn bộ tệp, sau đó tô màu theo phần trăm của phân phối này ( CDF ). Cách tiếp cận thích ứng này đảm bảo rằng mỗi màu trong bảng màu sẽ được sử dụng theo tỷ lệ bằng nhau. Hạn chế là những gì được vẽ màu xanh lam trong một tệp sẽ không giống với những gì được vẽ màu xanh lam trong một tệp khác nếu sử dụng phương pháp thích ứng này!

Không rõ ràng từ hình ảnh nếu Serato làm điều này, hoặc thực sự tiến thêm một bước và cố gắng phân đoạn tín hiệu - có thể không ngạc nhiên khi biết rằng các âm thanh có ghi chú trong tín hiệu âm nhạc có thể giúp đồng bộ hóa chúng ! Các bước sẽ là:

  • Tính toán Biến đổi Fourier ngắn hạn (biểu đồ phổ) của tín hiệu - sử dụng FFT trên các phân đoạn chồng chéo ngắn (bắt đầu với kích thước FFT là 1024 hoặc 2048 với âm thanh 44,1kHz).
  • Tính toán một chức năng phát hiện khởi phát. Tôi khuyên bạn nên xem bài viết này - phương pháp đề xuất rất hiệu quả và thậm chí việc triển khai C ++ chỉ mất chưa đến 10 dòng. Bạn có thể tìm thấy một triển khai trong Yaafe - như ComplexDomainOnsetDetection.
  • Phát hiện các đỉnh trong chức năng phát hiện khởi phát để có được vị trí của các bộ ghi chú.
  • Tính toán trọng tâm quang phổ trong tất cả các phân đoạn thời gian được phân định bởi các bộ dữ liệu được phát hiện (đừng quên cửa sổ và / hoặc không đệm!)
  • Và đừng quên bản đồ phi tuyến tính! Lưu ý rằng hiệu ứng chuyển màu xuất hiện giữa mỗi nốt trên dạng sóng Serato có thể được tạo ra một cách giả tạo.

Khi bạn làm việc này, "quả treo thấp" sẽ tính toán một vài tính năng khác trên mỗi phân đoạn (khoảnh khắc, một số ít MFCC ...), chạy phương tiện k trên các vectơ đặc trưng này và quyết định màu sắc của phân khúc sử dụng chỉ số cụm. Xem phần II của bài báo của Ravelli .


Tôi đã bắt đầu làm việc với giải pháp số 2 của bạn, may mắn thay, dịch vụ (EchoNest) tôi đang sử dụng cung cấp phát hiện khởi phát trong phân tích của họ để đó là tin tức tuyệt vời và tiết kiệm thời gian thực! Tôi đã cập nhật câu trả lời của mình bằng một bài kiểm tra nhỏ tôi đã làm và nó có vẻ đầy hứa hẹn (lưu ý rằng nó không được căn chỉnh chính xác vì nó thực sự nhanh và bẩn). Tôi sẽ đăng một kết quả tốt hơn khi tôi đã đạt được tiến bộ đáng kể. Cảm ơn bạn !
Aybe

1
Sau đó, bạn không có việc gì để làm. Hệ số "âm sắc" thứ hai trong phân tích EchoNest rất liên quan đến trọng tâm, vì vậy bạn không có bất kỳ tính toán nào để làm (trừ khi họ loại bỏ thành phần DC trong cơ sở của họ, trong trường hợp đó là hệ số thứ nhất) - chỉ cần sử dụng giá trị nhịp hoặc phân đoạn của vectơ "âm sắc".
pichenettes

1
"Độ sáng" được đo bằng hệ số "âm sắc" thứ hai trong phân tích EN rất liên quan đến trọng tâm quang phổ (sự khác biệt là máy phân tích EchoNest sử dụng một số tiền xử lý cảm nhận - lọc tai giữa, che dấu thời gian / tần số - thay vì lấy một FFT thô). Mã hóa màu bằng cách sử dụng thùng tối đa trong vectơ 'cao độ' sẽ hữu ích cho vật liệu đơn điệu, đơn điệu, nhưng khá vô nghĩa đối với vòng lặp trống.
pichenettes

1
Bối rối? Nó vẫn bị giới hạn bởi năng lượng tín hiệu trong khung được phân tích ... Tôi nghĩ rằng đối với tính năng này, đáng để giữ tỷ lệ phù hợp giữa các rãnh. Những gì tôi sẽ làm: thu thập một tá các bài hát rất đa dạng để cảm nhận về sự phân phối giá trị. Nếu cần thiết áp dụng một bản đồ phi tuyến tính đơn giản để làm cho nó trông gaussian hơn. Sau đó loại bỏ trung bình và chia theo độ lệch chuẩn. Sau đó áp dụng atan để làm cho nó bị chặn - đưa các ngoại lệ trở lại gần hơn với các decile thứ 1 hoặc thứ 9 mà không gây ra sự cắt xén.
pichenettes

1
Khi dạng sóng được thu nhỏ, phân đoạn tín hiệu của bạn theo các yếu tố lớn hơn như thanh hoặc phần - thay vì cố gắng tô màu các nốt / nhịp riêng lẻ.
pichenettes
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.