현재 듣고있는곡 - 메스머라이저
가사가 정신없는 멋진 곡이다
간단한 작곡 프로그램을 만들어보려 한다
사용 프로그램은 QT, 언어는 C++를 사용한다
근데 사실상 문법만 같은 다른 언어를 사용하는 감각이니 주의하자
알고리즘은 이미 C++로 작성해 두었으니 이것을 QT에 맞추에 적용하는 것이 문제이다
(시간이 날때 작성해둔 작곡 알고리즘이다)
일단 해보자
qt에서 새 프로젝트를 만든다
빌드는 qmake를 사용한다 cmake는 이제 qt측에서 구형이라고 하기도 했고, QML을 주력으로 사용하는 것 같아 나의 영역 밖의 이야기인 것 같다
새로운 프로젝트가 완성되었다
이제 이 UI창에서 원하는 기능을 드래그 - 드롭해서 구성을 만들어야 한다
일단 코드를 8개 생성해야 하니 빈칸 8개와 버튼 1개를 만들어 준다
이제 테스트로 버튼을 누르면 text에 1부터 6까지의 난수를 담아볼 것 이다
버튼에 cliked()를 추가한다
그럼 버튼을 누르면 일어날 이벤트를 정의할 수 있다
이제 난수를 만들어야 하는데, c++은 그냥 rand함수를 대충 넣으면 되지만, QT는 다른 함수를 사용해야 한다
int randomNumber = QRandomGenerator::global()->bounded(6);
이렇게 듣도못한 QRandomGenerator을 사용한다
(안써도 된다)
그리고 이를 텍스트에 넣기 위해서
ui->textEdit->setText(QString::number(randomNumber));
이런 방식을 취해야 한다
결과적으로 이런 코드가 나온다
void MainWindow::on_pushButton_clicked()
{
int randomNumber = QRandomGenerator::global()->bounded(6) + 1;
ui->textEdit->setText(QString::number(randomNumber));
}
테스트 해보자
첫번째 텍스트창에 난수가 들어간 것을 알수 있다
이제 이것을 사용해서 랜덤 음악코드 생성을 해보자
기본 골자가 되는 3도 화음 코드중 고정되어 있는 화음은 미리 설정해 준다
그후
int code_rule(int code){
if(code == 1) // 1
return rand() % 6 + 1;
else if(code == 2){ // 2
int sub = rand() % 2;
if(sub == 0)
return 4;
else
return 5;
}
else if(code == 3) // 3
return 2;
else if(code == 4){ // 4
int sub = rand() % 2;
if(sub == 0)
return 2;
else
return 5;
}
else if(code == 5){
int sub = rand() % 2;
if(sub == 0)
return 1;
else
return 2;
}
else if(code == 6){
int sub = rand() % 3;
if(sub == 0)
return 2;
else if(sub == 1)
return 4;
else if(sub == 2)
return 5;
}
return 0;
}
int extra_rule(int code){ // 3번 마디 특수 코드
if(code == 1){
int sub = rand() % 3;
if(sub == 0)
return 2;
else if(sub == 1)
return 4;
else if(sub == 2)
return 6;
}
else if(code == 2)
return 4;
else if(code == 3)
return 2;
else if(code == 4)
return 2;
else if(code == 5){
int sub = rand() % 2;
if(sub == 0)
return 1;
else
return 2;
}
else if(code == 6){
int sub = rand() % 2;
if(sub == 0)
return 2;
else
return 4;
}
return 0;
}
미리 작성해둔 작곡 코드 설정 함수를 가져온다
.........................
............
......
.
???
왜 rand()가 되는거지???
일단 되니까 사용하도록 하자
이제 cout같이 qt에서 사용되지 않는 부분들을 qt에 맞게 수정해준다
for을 사용할 방법이 없어서 그냥 노가다 해야한다
이제 테스트해보자
난수에 맞게 출력되는 것을 확인할 수 있다
이제 사용자에게 각 n도 화음에 맞는 코드를 랜덤하게 설정할 수 있게 해주자
텍스트 창과 버튼을 추가한다
이제 코드를 추가해야 한다
우선 코드 설정 버튼은 화음 버튼 뒤에 생성되어야 하기에, 기본적으로 false되어야 한다
이를 위해서 이런 코드가 사용된다
ui->pushButton->setVisible(bool);
이렇게 되면 bool에 따라 보이고 안보이고를 설정할 수 있다
이를 코드에 반영하면
이러한 형태를 가지게 된다
버튼 활성 비활성을 만들어 보자
ui->pushButton->setEnabled(false);
이런 형태의 코드를 사용한다
그리고 오류
문제는 ui->setupUi(this);를 뒤에서 한것이다
ui->setupUi(this);는 UI를 초기화 하는 역할을 한다는 것 같다
이제 이렇게 해주면 화음 코드 생성 버튼을 눌러야 코드 생성 버튼이 활성화 된다
이제 코드 생성 버튼을 누르면 코드가 생성되도록 하자
코드 생성 함수는 없어서 지금 정의해야 한다
만약 코드가
1도 C - E - G 일시
C, E, G 3개의 코드중 하나를 사용자에게 보여줘야 한다
이를 코드로 작성하자
1도 화음을 우선 만들어 보았다
화음 값을 int로 받으면 이에 맞추에 char값으로 코드를 반환해준다
이를 7도 화음까지 만들어 준다
hard-cording
이제 코드 생성 버튼을 누르면 코드가 생성되도록 이벤트를 짜준다
항상있는 버그 시간이다
setText가 char을 받지 못하고 있다
다른 방법이 필요한 것 같다
QString()으로 감싸버리면 되는 것 같다
이제 나머지도 셋팅해주자
하아아도 코딩 해준다
이제 테스트해보자
화음에 맞추에 코드를 던져준다
이제 멜로디를 똑같이 추가해주면 된다
멜로디가 들어갈 텍스트 박스를 넣어준다
함수는 make_chord와 매커니즘이 똑같기에 무시해도 된다
버튼 이벤트에 하드 코딩으로 넣어준다
잘나온다
이 틀을 기반으로 효과음, UI를 추가해주면 될 것 같다
'개발일지 > 기타' 카테고리의 다른 글
[QT] QT creator - 간단 작곡 코드 생성 프로그램 만들기(C++) - 5 종료 버튼, 멜로디 듣기 버튼 (0) | 2024.05.20 |
---|---|
[QT] QT creator - 간단 작곡 코드 생성 프로그램 만들기(C++) - 4 효과음, 배경음악 넣기 (0) | 2024.05.20 |
[QT] QT creator - 간단 작곡 코드 생성 프로그램 만들기(C++) - 3 (0) | 2024.05.20 |
[QT] QT creator - 간단 작곡 코드 생성 프로그램 만들기(C++) - 2 (0) | 2024.05.19 |
아두이노 플레쉬 암산 게임기, 부저로 효과음 넣기 (0) | 2024.05.11 |