2009-01-22 2 views
10

정규 표준 표기법으로 작성된 단일 악기의 간단한 악보를 어떻게 모델링 하시겠습니까? 분명히 거기에 정확히 많은 라이브러리가 있습니다. 저는 주로 데이터 구조에서 음악을 표현하는 다양한 방법에 대해 궁금합니다. 효과가있는 것은 무엇이고 그렇지 않은 것은 무엇입니까?데이터 구조에서 음악을 어떻게 표현합니까?

다이내믹과 같은 더 까다로운 부분을 무시하면 명백한 방법으로 모든 것을 객체로 번역 할 수 있습니다. 점수는 노트로 만들어집니다. 합성 (synthesis)은 각 음표의 시작/끝 시간을 알아 내고 사인파를 혼합하는 것을 의미합니다.

좋은 방법인가? 이 작업을 수행하는 다른 방법은 무엇입니까?

+0

이것은 매우 흥미로운 프로그램이 될 수 있습니다. 만약 당신이 "점수"객체를 가져 와서 음악 이론 "규칙"을 적용한다면 (음악 이론의 미성년자가있을 수 있습니다) 잠재적으로 어떤 유형의 음악 생성기를 만들 수 있습니다 ... 깔끔하게 될 것입니다 ... 나는 그것이 완료되었다고 확신합니다. . – Nope

+1

@Casey : 수 백만 번 해봤지만 결코 잘되지 않았습니다. – MusiGenesis

+0

@MusiGenesis ... 그건 내가 생각한 것입니다. 아 글쎄, 한번 시도해 보는 것도 재미있을거야. – Nope

답변

5

이 작업을 수행하는 일반적인 방법은 MIDI 파일입니다.MIDI는 시작 및 종료 시간, 음량, 연주 된 악기 및 다양한 특수 특성을 포함하여 음표에 관한 데이터를 저장하기위한 표준 형식입니다. 파일을 읽고 쓰고, 배열이나 객체의 관점에서 데이터를 표현하기위한 많은 미리 작성된 라이브러리 (일부 오픈 소스 포함)를 찾을 수 있습니다. 일반적으로 각 노트에 대해 오브젝트를 사용하여 수행하지는 않지만 많은 메모리 오버 헤드를 추가합니다.

MIDI에서 정의 된 악기는 바이올린이나 트럼펫 같은 상징적 인 이름을 가진 1에서 128까지의 숫자 일 뿐이지 만 MIDI 자체는 악기가 실제로 들리는 것과 같은 것을 말하지 않습니다. 이것이 신디사이저의 작업입니다.이 신디사이저는 고급 MIDI 데이터를 사운드로 변환합니다. 원칙적으로, 네, 사인파를 겹쳐서 소리를 낼 수는 있지만 실제로 몇 개의 트랙을 평행하게 연주하면 계산이 많이 필요하기 때문에 실제로는 잘 작동하지 않습니다. 또한 간단한 푸리에 스펙트럼 (사인파의 상대적인 강도)은 악기의 실제 사운드와 연주하는 사람의 표현력을 재현하려고 할 때 적합하지 않습니다. (나는 이것을하기 위해 간단한 신디사이저를 썼다. 그래서 나는 그것이 알맞은 사운드를 만들어 낼 수 있음을 안다.) 합성 과학, 더 일반적으로는 DSP (디지털 신호 처리)에 관한 많은 연구가 이루어져야한다. 원한다면 확실히 많은 책과 웹 페이지를 읽을 수 있어야합니다.

또한이 내용은 질문과 관련이있을 수 있지만 ChucK이라는 오디오 프로그래밍 언어에 관심이있을 수 있습니다. 그것은 프로그래밍과 음악의 갈림길에있는 사람들에 의해 디자인되었으며, 아마도 당신은 그것으로 놀아서 사운드 합성의 현재 상태에 대한 좋은 아이디어를 얻을 수 있습니다.

+1

MIDI는 주변에 많은 라이브러리가 구축되어 있지만 70 년대 시대 장비의 기술적 한계를 극복 한 진정한 구식 형식입니다. 그 끔찍함의 한 예로, 특정 노트에 대한 켜기와 끄기는 노트의 두 속성 대신 두 개의 개별 이벤트로 저장됩니다. – MusiGenesis

+0

... 노트의 길이를 변경하려면 검색해야합니다 노트 오프 이벤트와 그것을 이동합니다. 또한 MIDI는 마이크로 튜닝을 잘 처리 할 수 ​​없으므로 서구가 아닌 규모의 구조는 실제로 가능하지 않습니다. – MusiGenesis

+1

...하지만 MusiGenesis는 물론 오프 이벤트가 분리되어 있습니다. MIDI 키보드는 노트를 릴리스하기 전에 on 이벤트를 보내야하기 때문에 다소 시간이 걸릴 수 있습니다.그러나 나는 미디 표준이 처음 시작할 기회가 주어지면 우리가 만들지 않을 것이라고 동의한다. –

2

흠, 재미있는 문제.

사실, 저는 이것을 Composite와 함께 Command 패턴으로 바꾸고 싶습니다. 이것은 명사 대신 모델링 된 오브젝트를 만드는 의미에서 일반적인 OO 접근 방식을 그 머리에 돌리는 것입니다.

참고는 한 가지 방법이있는 클래스 인 play(), and a ctor taking 길이 and 톤입니다.

당신은 synth : 음색, 어택 등의 행동을 정의하는 악기가 필요합니다.

그런 다음 TimeSignature가있는 점수를 가지며 측정 값이 포함 된 복합 패턴입니다. 측정은 메모를 포함합니다.

실제로 재생한다는 것은 다른 컨테이너 인 반복 및 Codas와 같은 다른 것들을 해석한다는 것을 의미합니다. 이를 연주하기 위해, Composite의 계층 적 구조를 해석하여 대기열에 노트를 삽입합니다. 노트가 템포에 따라 큐를 통해 이동하면 각 노트에 play() 메서드가 호출됩니다.

흠, 그 반대 일 수 있습니다. 각 음표는 악기에 대한 입력으로 주어지며 필요에 따라 파형을 합성하여 해석합니다. 원래 계획과 같은 것으로 되돌아옵니다.

분해에 대한 또 다른 접근법은 Parnas의 법칙을 적용하는 것입니다. 요구 사항이 변경 될 수있는 비밀 장소를 유지하기 위해 분해합니다. 그러나 나는 비슷한 분해로 끝난다 고 생각한다. 박자표와 튜닝을 변경할 수 있습니다. 악기를 변경할 수 있습니다. 참고로 바이올린, 피아노 또는 마림바에서 연주해도 상관 없습니다.

흥미로운 문제.

2

내 음악 구성 소프트웨어 (내 프로필 참조)는 기본 위치 (시작 위치, 길이, 음량, 균형, 릴리스 지속 시간 등의 속성이 있음)로 Notes를 사용합니다. 노트는 트랙 (자체 악기 또는 악기가있는)로 그룹화 된 패턴 (자체 시작 위치 및 반복 속성이 있음)으로 그룹화됩니다.

사인파를 혼합하는 것은 소리를 합성하는 한 가지 방법이지만 매우 희귀합니다 (비싸고 소리가 좋지 않습니다). Wavetable 합성 (내 소프트웨어에서 사용하는)은 계산 비용이 저렴하고 코드 작성이 비교적 쉽고 제작할 수있는 다양한 사운드에서 본질적으로 무제한입니다.

7

새로운 서양 음악 표기법 프로젝트를하는 많은 사람들은 MusicXML을 시작점으로 사용합니다. 그것은 당신의 요구에 부합 할 수있는 음악 표기법의 완전한 표현을 제공합니다. 이제는 ProxyMusic과 같은 프로젝트가 MusicXML 객체 모델을 만드는 데 사용하는 XSD 스키마 정의가 있습니다. ProxyMusic은 이들을 Java로 작성하지만, 다른 언어의 다른 XML 데이터 바인딩 도구와 유사한 기능을 수행 할 수 있어야합니다. 하나 명 MusicXML 고객은 넣어

으로 :

"지금까지 내가 걱정으로 MusicXML에 하드 모든 작업의 ​​매우 중요한 이점은 내가 명확하고 구조화 매우 '현실 세계로 사용할 수 있다는 것입니다 내 응용 프로그램의 내부 데이터 구조를 디자인하고 구현하기 위해 어떤 음악을 '실용적인'사양으로 지정했는지 확인해야합니다. XSD를하고 DTD를, 샘플 파일, 튜토리얼, 지원되는 응용 프로그램의 목록, 출판물 목록 등 - -

http://www.makemusic.com/musicxml

에서이 MIDI는 매우 좋지 않다

는 더 많은 정보를 사용할 수를있다 표준 표기법의 간단한 악보를위한 모델입니다. MIDI에는 음악 표기법의 기본 개념이 많이 부족합니다. 표기 형식이 아닌 성능 형식으로 설계되었습니다.

음악 표기법이 계층 적이지 않은 것은 사실입니다. XML은 계층 구조이므로, MusicXML은 비 계층 적 정보를 나타 내기 위해 쌍을 이루는 시작/멈춤 요소를 사용합니다. 원시 데이터 구조는 사물을보다 직접적으로 나타낼 수 있기 때문에 MusicXML이 데이터 구조의 시작점에 불과합니다.

동시 수평 및 수직 구조를 포착하는 음악 표기법을보다 직접적으로 표현하려면 스프레드 시트/격자 모델을 더 사용하는 Humdrum 형식을 살펴보십시오. Humdrum은 특히 데이터 구조가 특히 잘 작동하는 음악 및 음악 분석 응용 프로그램에 사용됩니다.

+0

MusicXML 사용에 대한 좋은 점은 MusicXML을 사용하는 방법을 알고있는 기존의 많은 도구로 음악을 가져올 수 있다는 것입니다. –

3

음악은 데이터 구조, 표준 표기법, ...

LilyPond에 관심이 있으시군요.

음악 표기법에 관한 대부분의 것들은 거의 순수 기계적 (표기법의 복잡하고 중요한 부분조차도 규칙과 지침이 있습니다)이며 LilyPond는 모든 기계적 측면을 돌보는 아름다운 일을합니다. 남은 것은 텍스트 편집기에서 작성하기 쉬운 입력 파일입니다. LilyPond는 PDF 외에도 Midi 파일을 생성 할 수 있습니다.

당신이 그렇게 생각한다면, 프로그램을 사용하여 텍스트 파일을 algorythimically 생성하고 LilyPond를 호출하여 표기법과 midi 파일로 변환 할 수 있습니다.

LilyPond의 입력 파일보다 음악을 표현하는 데 더 완전하고 간결한 방법을 찾을 수 있을지 의심 스럽습니다.

음악 및 악보 계층 아닌 계층 적 생각을 엄격하게 준수함으로써 (물론) 모델링 할 수있음을 양해 해 주시기 바랍니다. 해당 주제에 대한 정보는 Read this입니다.

재미있게 보내세요!

1

모델의 유용성은 주어진 상황에서만 평가할 수 있습니다. 이 모델로 무엇을하려고합니까?

많은 응답자가 음악이 비 계급 적이라고 말했습니다. 나는 이것에 동의하지만, 대신 음악이 여러 가지 관점에서 계층 적으로 보여 질 수 있다고 제안합니다. 각각의 계층은 서로 다른 계층을 만들어냅니다. 우리는 그것을 음성의 목록으로보고 싶을 것입니다. 각각은 on/off/velocity/etc 속성이있는 음표가 있습니다. 또는 고조파 분석의 목적으로이를 수직적 인 음계로보고 싶을 수도 있습니다. 아니면 대칭 분석에 적합한 방식으로 보길 원할 수도 있습니다. 또는 다른 많은 가능성. 더욱 나쁜 점은 단일 목적을 위해 이러한 여러 관점에서 볼 수 있습니다.

대위법을 생성하고 조화와 색조 센터를 분석하기 위해 음악을 모델링하려는 시도를 여러 번 해본 결과 저는 음악이 내 모델링 기술에 굴복하지 않음으로써 계속해서 좌절감을 느끼고 있습니다. 가장 좋은 모델은 관계형 일 수 있다고 생각하기 시작했습니다. 단순히 데이터의 관계형 모델을 기반으로 한 모델이 사용 컨텍스트에 대한 관점을 취하려고하지 않기 때문입니다. 그러나, 그것은 단순히 문제를 다른 곳으로 밀어 낼 수 있습니다.

+0

이것은 귀하의 의견에 대한 좋은 텍스트이지만, 나는 생각하지 않습니다, 이것은 OP 질문에 대한 anwers – user1781290