랜덤 연주 MIDI 파일 생성하기

프로그래밍과 신체감각최종 업데이트:

음표를 무작위로 설정하고 이를 MIDI 파일로 출력하는 애플리케이션을 만듭니다.

MIDI 파일을 처음부터 직접 생성하기 위해, MIDI 파일의 구조와 기본 지식, 그리고 2진수와 16진수 데이터를 확인하면서 파일을 만드는 방법을 소개합니다.

애플리케이션의 코어는 C++로 작성하고, WebAssembly를 사용하여 웹 앱으로 공개할 예정입니다.

1. MIDI 파일이란?

MIDI에 대하여

MIDI형식은 음악 정보, 즉 음표를 표현하는 데이터를 기록하고, 전자 악기 간에 주고받을 수 있도록 정의된 규격입니다.

MIDI 파일이란

MIDI 파일이란

기록해야 할 음표 정보란 무엇인가?

위의 이미지는 필자가 사용하는 음악 제작 소프트웨어 Cubase(버전 12)입니다. 대부분의 음악 제작 프로그램에서는 피아노 롤이라 불리는 영역에 ‘가로 막대’를 그려서 음표의 정보를 기록합니다.

이 막대는 음정(높낮이)과 길이를 가지며, 건반을 얼마나 세게 눌렀는지를 나타내는 Velocity(벨로시티) 정보도 기록합니다. 이러한 음표 정보를 여러 개 만들어 화면 오른쪽의 가상 악기로 전송하면, 최종적인 소리가 만들어집니다.

제작 결과 예시

제작 결과 예시

프로젝트의 최종 형태

이 프로젝트의 최종 버전은 아래 링크에서 확인할 수 있습니다. 내보낸 MIDI 파일은 대부분의 음악 소프트웨어에서 사용할 수 있으며, 기본 피아노 음색으로도 재생이 가능합니다.

여기에서 확인하세요

2. 프로젝트 이미지

바이너리 데이터를 파일에 기록하기

먼저 프로그래밍으로 파일에 데이터를 기록하는 것부터 시작해 봅시다. C++에서는 ofstream이라는 도구를 사용하여 파일에 데이터를 쓸 수 있습니다.

도구 준비하기

코드의 맨 위에 다음 줄을 추가하세요:
#include < iostream >
#include < fstream >

이렇게 하면, 입력과 출력(io)을 ‘스트림(stream)’처럼 다룰 수 있는 도구를 사용할 수 있으며, 파일(f)도 처리할 수 있게 됩니다.

파일 안에 정보를 쓰기

//
#include < iostream >
#include < fstream >


int main () {

        // 입력을 받아들이기 위한 공간을 준비
	char inputData[100];

	// OFSTREAM 오브젝트를 준비
	std::ofstream outputFile;

	// 파일명을 지정하여 오픈
	outputFile.open("書き出したファイル.dat");

	// 유저를 위한 인터페이스
	std::cout << "입력 후 Enter를 눌러주세요(100문자)" << std::endl;
	std::cout << ">> "; 

        // 유저의 입력을 기다림
	// 하나의 행을 입력받음
	// 또는,
        // 분리용 문자를 지정하여 추가 행을 정의
	std::cin.getline(inputData, 100);

        // 보존되었던 데이터를 파일로 저장
	outputFile << inputData << std::endl;


	// 정보 저장을 위한 파일을 닫기
	outputFile.close();


	return 0;

}

프로그램 컴파일하기

g++ main.cpp -o main

컴파일 및 실행

g++ main.cpp -o main

명령은 main.cpp 파일을 main이라는 실행 파일로 변환합니다.

생성된 main 파일은 ./main 명령으로 실행할 수 있습니다.

실행 파일은 운영체제에 따라 다릅니다. Windows에서는 .exe 확장자를 사용하고, macOS나 Linux에서는 보통 확장자를 붙이지 않습니다.

* 현재 교재를 작성 중입니다 *

* 현재 교재를 작성 중입니다 *
← 코스 목록으로 맨 위로 ↑