2009-09-06 20 views
13

Tôi có nhạc nền cho một số bài hát có sẵn ở cả hai định dạng .MID và .KAR, nhưng trong mỗi trường hợp, nó được phát nhanh hơn tôi muốn. Cách đơn giản nhất để tạo tệp .MID hoặc .KAR có cùng nội dung nhưng với tốc độ chậm hơn - giả sử, một tệp bị chậm lại 20% hoặc hơn, một tệp khác 15%, một phần ba 25%, v.v. Lý tưởng nhất, tôi thích một kịch bản Python đa nền tảng (vì điều đó sẽ cho phép tôi dễ dàng thử nghiệm tinh chỉnh nguồn để hội tụ với hiệu ứng chính xác mà tôi muốn ;-), nhưng tôi sẽ thực hiện bất kỳ giải pháp miễn phí nào chạy trong Linux (Ubuntu 8.04 nếu nó quan trọng) và Mac (Mac OS X 10.5, nhưng ưu tiên tương thích 10.6).Làm thế nào để "làm chậm" một tệp MIDI (lý tưởng trong Python)?

+0

Bạn đã xem xét định dạng OSC chưa? http://en.wikipedia.org/wiki/Open_Sound_Control – magnetar

Trả lời

9

Bạn có thể chỉnh sửa các tập tin, theo http://www.sonicspot.com/guide/midifiles.html

Mặc dù có lẽ là một đọc MIDI/viết thư viện rồi. Trong thực tế, đó là một vấn đề nhìn thấy những câu hỏi liên quan: Simple, Cross Platform MIDI Library for Python

Set Tempo

kiện meta này thiết lập tiến độ chuỗi về micro mỗi tứ lưu ý đó là mã hóa trong ba byte . Nó thường là được tìm thấy trong đoạn đường rãnh đầu tiên, liên kết thời gian để xảy ra cùng một lúc dưới dạng thông báo đồng hồ MIDI để quảng bá đồng bộ hóa chính xác hơn . Nếu không có đặt sự kiện tiến độ, hiện có 120 lần đánh bại mỗi phút. Công thức sau có thể được sử dụng để dịch tốc độ từ micro giây trên phần tư để ghi lại mỗi phút và quay lại.

 
MICROSECONDS_PER_MINUTE = 60000000 

BPM = MICROSECONDS_PER_MINUTE/MPQN 
MPQN = MICROSECONDS_PER_MINUTE/BPM 
 
Meta Event Type Length Microseconds/Quarter-Note 
255 (0xFF) 81 (0x51) 3 0-8355711 
+0

Ah tốt, có vẻ như tôi sẽ không có thêm bất kỳ kỹ thuật trực tiếp nào nữa, vì vậy xin cảm ơn kỹ thuật này, @Vinko. –

+0

Vì vậy, rất nhiều cho SO là tuyệt vời, huh? :-) Khi bạn ** THỰC HIỆN ** cần nó, nó luôn luôn thất bại. –

13

Như Vinko nói, bạn có thể chỉnh sửa midifile, nhưng vì đó là một định dạng nhị phân, vắt vào số lượng tối thiểu của các bit có thể, nó sẽ giúp bạn có được giúp đỡ.

Đây là một midi-to-text chuyển đổi (và ngược lại):
http://midicomp.opensrc.org/
Tôi đã sử dụng nó khá một chút thời gian gần đây. nó khá tầm thường để xử lý văn bản (ví dụ: tìm kiếm dòng với "Tempo") cho các hoạt động đơn giản khi bạn có phần giữa là văn bản. đã không thử trên mac (biên dịch không có vấn đề trên ubuntu 8,04).

Về nhịp độ giữa cụ thể, rất dễ làm chậm hoặc tăng tốc phát lại vì thời gian của sự kiện được xác định theo "bọ", thời gian thực tính bằng giây được xác định bởi tham số tiến độ được mô tả trong trích dẫn của Vinko. Tôi tin rằng chữ ký thời gian không phải là quá có liên quan, và chủ yếu là để hiển thị các thanh/nhịp đập một cách chính xác khi mở trong một sequi midi.

Ngoài ra, ngoài pyPortMidi, còn có một vài mô-đun python khác xung quanh.

[hmmm ... có vẻ như tôi chỉ có thể đăng trên liên kết trên mỗi bài đăng, là người dùng mới. tôi sẽ thử đăng liên kết lên các mô-đun python trong một vài nhận xét hoặc một vài câu trả lời khác ...]

+1

Mô-đun Python để đọc, ghi, tạo/chỉnh sửa các tệp midi midi:

+0

Lớp để đọc và ghi các tệp midi (bài đăng này có vẻ là nguồn duy nhất):

+0

Tôi cũng tìm thấy điều này, mặc dù tôi chưa thử:

0

Tôi có sở thích tương tự như bài đăng của bạn.Tôi chỉ đi qua thư viện này trông rất hứa hẹn:

http://web.mit.edu/music21/

+0

Lưu ý rằng [câu trả lời chỉ có liên kết] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích, các câu trả lời SO phải là điểm cuối của việc tìm kiếm giải pháp (so với nhưng một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

+0

Thay thế đối tượng tạm thời.MetronomeMark ở đầu mỗi nhân viên bằng một đối tượng mới nên thực hiện thủ thuật. Lưu ý rằng hiện tại music21 sẽ định lượng mọi tệp MIDI. Chỉ cần thêm vào danh sách việc cần làm của chúng tôi để làm cho tùy chọn đó. –

1

Bạn có thể sử dụng music21 để làm điều này, mặc dù tôi đã chỉ được thử nghiệm nó trên OSX 10.10.1.

import music21 

fctr = 1.25 # scale (in this case stretch) the overall tempo by this factor 
score = music21.converter.parse('song.mid') 
newscore = score.scaleOffsets(fctr).scaleDurations(fctr) 

newscore.write('midi','song_slow.mid') 

Các khoảng trống giống như dấu thời gian của từng ghi chú và thời lượng là ghi chú trong bao lâu, tôi tin rằng áp dụng cùng một yếu tố tỷ lệ cho từng loại giống như điều chỉnh tiến độ.

Nếu bạn giống tôi thì bạn đang nghe những bài hát tương tự 7 năm sau và có thể dùng thử! Nếu không, tôi hy vọng điều này sẽ giúp một người khác thức dậy ngày hôm nay như tôi và đã gãi đầu của tôi cố gắng để giải quyết vấn đề này một cách dễ dàng.

+0

fastScore = score.augmentOrDiminish (1.25) - sẽ mở rộng khoảng thời gian và bù trừ và một số thứ khác để làm cho điểm số đầu ra chính xác. –

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