[OpenCV+Pretty midi] MIDI 이미지를 출력해 봤습니다!

본 신청은'우동팀'여러분이 주최하는'첫 번째 추가 달력 22일차 보도입니다!
"진짜 처음인가요?"이런 수준의 재미있는 기사가 많으니 다른 항목도 꼭 보세요~!
개시하다
나는 1년여 전 발매를 망설이며 발표하지 않았던 응용 프로그램의 핵심 기능인 이미지 생성 음악 기능의 설치를 이곳에서 제공했다.
이 글의 독자 대상
  • 이상한 기술에 관심이 있는 사람
  • MIDI 이미지를 만들고 싶어요!인정
  • 프로그래밍된 음악을 사용하는 것에 관심이 있는 사람
  • 사용 환경
  • Python 3.9.0
  • OpenCV 4.5.4
  • NumPy 1.21.5
  • Pretty_midi 0.2.9
  • 사용할 이미지
    모두가 좋아하는 이미지 처리를 사용한 프레젠테이션에서 익숙한 레나 씨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_midiPretty_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씨를 빌려서 입력한 이미지에 따라 다양한 결과를 얻을 수 있습니다. 이 글을 읽고 조금 신경 쓰이는 분들은 반드시 수중에 있는 이미지를 시험해 보세요!

    좋은 웹페이지 즐겨찾기