[OpenCV+Pretty midi] MIDI 이미지를 출력해 봤습니다!
14445 단어 pretty_midiOpenCVPython음악.
"진짜 처음인가요?"이런 수준의 재미있는 기사가 많으니 다른 항목도 꼭 보세요~!
개시하다
나는 1년여 전 발매를 망설이며 발표하지 않았던 응용 프로그램의 핵심 기능인 이미지 생성 음악 기능의 설치를 이곳에서 제공했다.
이 글의 독자 대상
모두가 좋아하는 이미지 처리를 사용한 프레젠테이션에서 익숙한 레나 씨
Lenna.png
.소스 코드
create_music.py
import numpy as np
import cv2
import pretty_midi as pm
def get_edge_image(image_path: str) -> np.ndarray:
origin_img = cv2.imread(image_path, 0)
if(origin_img is None):
print('画像が読み込めませんでした')
exit()
return cv2.Canny(origin_img, 50, 200)
def get_resized_image(image: np.ndarray) -> np.ndarray:
return cv2.resize(image,dsize = (round(128 / image.shape[0] * image.shape[1]),128))
def image2score(image_path: str) -> None:
image_score = pm.PrettyMIDI()
piano = pm.Instrument(0)
img = get_resized_image(get_edge_image(image_path))
start_second = 0
end_second = 0
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if img.item(i,j) != 0:
piano.notes.append(pm.Note(100, j, start_second, end_second))
start_second += 0.5
end_second += 0.5
image_score.instruments.append(piano)
image_score.write('output.mid')
if __name__ == '__main__':
image_path = input('ファイル名を入力してください>>')
image2score(image_path)
다음은 각 함수의 동작에 대해 설명합니다!get_edge_image
get_edge_image
def get_edge_image(image_path: str) -> np.ndarray:
origin_img = cv2.imread(image_path, 0)
if(origin_img is None):
print('画像が読み込めませんでした')
exit()
return cv2.Canny(origin_img, 50, 200)
OpenCV를 사용하여 이미지를 회색조로 읽은 후 Canny 함수를 사용하여 가장자리 감지 결과를 반환합니다.되돌아오는 값의 내용은 이런 느낌이다.
get_resized_image
get_resized_image
def get_resized_image(image: np.ndarray) -> np.ndarray:
return cv2.resize(image,dsize = (round(128 / image.shape[0] * image.shape[1]),128))
매개변수가 받은 이미지 크기를 高さ127px
로 조정하여 가로 세로 비율을 변경하면 MIDI 이미지가 반환됩니다.되돌아오는 값의 내용은 이런 느낌이다.
image2score
image2score
def image2score(image_path: str) -> None:
image_score = pm.PrettyMIDI()
piano = pm.Instrument(0)
img = get_resized_image(get_edge_image(image_path))
start_second = 0
end_second = 0
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if img.item(i,j) != 0:
piano.notes.append(pm.Note(100, j, start_second, end_second))
start_second += 0.5
end_second += 0.5
image_score.instruments.append(piano)
image_score.write('output.mid')
방금 조정된 흑백 이미지 縦方向のピクセルをノートナンバー(0~127)
, 横方向のピクセルをノート(音)
를 MIDI로 변환하여 출력합니다.이 함수에 사용되는 모듈 중 하나Pretty_midi는
Pretty_midiインスタンス生成
->楽器インスタンス生成
->楽器にノート(音)を追加
->Pretty_midiインスタンスの楽器リストに楽器インスタンスを追加
->Pretty_midiインスタンスをMIDIとして出力
의 순서에 따라 설명된 외부 모듈로 MIDI 파일을 간단하게 생성할 수 있다.Note 인스턴스를 작성할 때
pm.Note(100, j, start_second, end_second)
섹션은 매개변수에 (大きさ,ノートナンバー,開始(s),終わり(s))
를 지정하여 사운드의 강약, 음계, 길이를 설정할 수 있습니다.이 함수로 출력된 MIDI 파일을 Garage Band에서 연주한 결과여기.(Qita에 음악을 올릴 수 없어 Google Drive의 공유 링크를 붙여 넣었음)
새벽에 잘 안 듣는 좋은 음악을 만들 수 있다(웃음)
총결산
이번에는 MIDI 이미지를 내보냈습니다!
이번에 Lenna씨를 빌려서 입력한 이미지에 따라 다양한 결과를 얻을 수 있습니다. 이 글을 읽고 조금 신경 쓰이는 분들은 반드시 수중에 있는 이미지를 시험해 보세요!
Reference
이 문제에 관하여([OpenCV+Pretty midi] MIDI 이미지를 출력해 봤습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yu_yukk_Y/items/ad59c76ea498d2510f2a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)