Beep() 함수로 화음을 연주하는게 가능한가요?

noblepylon의 이미지

Beep()를 이용해서 간단한 선율을 연주하는 프로그램을 만들보았습니다.

enum freq { /* 음표의 높이 (Hz단위로 표현) */ };
 
enum dura { /* 음표의 길이 (ms단위로 표현) */ };
 
void Play(freq pitch, dura value);
void Sleep(dura value);
 
int main()
{
    Play(G, Quarter); Play(G, Quarter); Play(A, Quarter); Play(A, Quarter); // 솔솔라라
    Play(G, Quarter); Play(G, Quarter); Play(E, Half); // 솔솔미
    Play(G, Quarter); Play(G, Quarter); Play(E, Quarter); Play(E, Quarter); // 솔솔미미
    Play(D, HalfDot); Sleep(Quarter); // 레
(생략)
}
 
void Play(freq pitch, dura value)
{
     Beep(static_cast< int >(pitch), static_cast< int >(value));
}

그런데 이렇게 할 경우 가장 큰 단점이 한번에 한 가지 음밖에 낼 수 없다는 겁니다.
화음(예: 도미솔)을 한번에 내는 방법이 없을까요?
(멀티태스킹을 해야하려나...)

snowall의 이미지

play 안에 beep을 두개 넣으면 안될까요?

(근데, 안될 것 같아요...-_-;)

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

송효진의 이미지

msdos 시절의 그 지저분(?)한 소리를 원하신다면,
반복문 {
Play(C, 100);Play(E, 100);Play(G, 100);
}

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

noblepylon의 이미지

결국은 한번에 한 음이란 소리인데-_-;

사운드카드를 조종하는 길밖에 없겠군요.
그런데 어떻게 하는지 모르겠다는(!)게 문제긴 합니다.
---
"The truth will make you free."(John 8:32)
"I am the way, and the truth, and the life: no one comes to the Father but through Me."(John 14:6)

---
“내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)

Necromancer의 이미지

구조가 그렇습니다.

pc speaker는 한번에 한 주파수만 만들어 내보낼 수 있지만
사운드카드는 음을 만들어내는 주파수발진기가 여러개 있습니다.
정확히 생각 안나지만 사블만 해도 8개 정도는 되는걸로 알고 있고요

그리고 출력 모드에 따라 제한이 있긴 하지만 사카는 단순히 주파수만
조절할 수 있는게 아니라 음색 등등에서 조절 옵션이 더 많습니다.
얘네들 소리를 섞으면 다양한 화음을 만들어 낼 수 있죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

noblepylon의 이미지

사운드카드 조절 라이브러리 비슷한 게 있나요?
---
"The truth will make you free."(John 8:32)
"I am the way, and the truth, and the life: no one comes to the Father but through Me."(John 14:6)

---
“내게 능력주시는 자 안에서 내가 모든 것을 할 수 있느니라.”(빌립보서 4:13)

simpid의 이미지

결론적으로 가능은 하지만 제한적입니다.

음을 발생시키는데는 몇가지 방법이 있습니다.

(1) PC 스피커의 방식으로 스피커에 전기를 넣었다 뺐다 하면서 소리를 발생시키지만
전기를 넣었다 뺐다 하는 간격은 조절할 수 있지만 강도 조절이 불가능 하므로 소리에 한계가 많습니다.
원칙적으로 화음 넣는게 불가능 하지만 압력 이론에 따라 간격을 조절해서 화음 비스무레 하게는 가능합니다.
Apple이나 IBM PC-XT 시절 몇가지 프로그램이 나와서 신기했던 기억이 납니다.
결론은 가능은 하지만 너무나 제한적입니다.
더이상 PC 스피커로 뭔가 해보시는걸 포기하시길 권합니다.

(2) FM (Frequency Modulation)
주파수 발생 장치를 이용한 방법입니다.
유명한 애들립(Adlib) 카드등에서 사용하는 방법입니다.
원하는 주파수를 발생시켜 음을 내고(예를 들면 440Hz 의 파형을 발생 시켜 '라' 음을 내는등)
발생한 음의 강도(인벨로프) 를 조정하여 음색(?) 을 흉내냅니다.
그리고 음에 잡음을 섞어서 드럼 소리를 흉내냅니다.
흉내라는 표현을 쓴거는 음의 품질이 어떤 악기 소리구나 하고 느낄 순 있지만 사실감 있는 악기 소리는 구조적으로 낼 수 없기 때문입니다.
(1) 방식하고 다른 인벨로프 부분을 위해 Attack, Sustain, Release, Decay 라는 구분을 통해 강도르 조절합니다.
피아노 소리를 예를 들면 건반을 누르는 순간 소리가 확 커졌다가 살짝 작아져서 그 소리가 잠시 유지되다가 서서히 사라지는 단계를 4가지 팩터를 통해 조정을 합니다.
FM 방식을 이용하면 원하시는 화음의 구현이 가능합니다.
음악카드 스펙에 보면 FM 방식으로 동시 발음 수가 표기되어 있습니다.
과거 8비트 컴퓨터중 MSX 는 3중 화음이 가능했었는데... 3중 화음으로 별걸 다 했던 기억이 납니다.

(3) PCM (Pluse Code Modulation)
CD 플레이어나 MP3 등에서 사용하는 방식입니다.
소리를 주파수에 따라 시간대로 구분하여 각각의 음의 압력을 기록하는 방식입니다.
요즘에 우리 주위에서 인공적으로 발생하는 모든 소리는 PCM 방식을 따릅니다.
변형으로 ADPCM (Adaptive Difference Pulse Code Modulation) 등이 있지만 PCM 의 범주에 모두 들어갑니다.
MIDI 장비 등에서 나는 음도 PCM 방식입니다.

bushi의 이미지

옛날, '이야기' 라는 통신 프로그램에서 '파일 다운로드 종료' 시에 화음으로 벨을 울려줬더랬습니다.
1번 방식이죠.
'도미솔' 화음이 필요하면 '도' '미' '솔' 을 짧은 간격으로 번갈아가며 연주합니다.

한참 시간이 지난 후에, windows 95 였던가... beep 스피커로 사운드 카드를 에뮬레이션 해 주었었습니다.
PC beep 스피커는 음의 높낮이만 표현 할 수 있을 뿐 크기는 표현이 불가능하고,
PCM 데이타는 크기와 높낮이가 혼재되어 있기 때문에 상당히 난감합니다.
앞뒤 code를 살펴서 적당한 frequency 를 대강 추출하는 것이기 때문에 음질은 개판이었습니다.

덧.

예전에 꼬꼬가 진행하는 지상파 TV 예능프로그램에 유명한 오페가 가수 한분이 선생님으로 출연하셔서
시범을 보인 적이 있습니다.
'아~' 라는 발성을 하되, 음의 높낮이만 바꾸고 음의 크기(성량)은 처음부터 끝까지 일정하게 유지하는...
이게 상당히 어렵다고 하더군요.
이런면에서.... PC beep 스피커는 상당한 고급 audio 출력장치 ?

OTL

cppig1995의 이미지

화음은 아니지만 MS-DOS의 PC 스피커 인터페이스를 통해 고유형식으로 지정된 음악을 플레이하는 프로그램입니다.
--
임수서룬뫼 윤희수 {cppig1995/돼지군}

댓글 첨부 파일: 
첨부파일 크기
Plain text icon pcssp.rar_.txt23.91 KB

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.