Srs, boa noite a todos.
Venho aqui novamente pedir uma ajuda, tenho um código que muda a tonalidade de uma musica para outra tonalidade, exemplo;
Uma musica que esteja em Do maior, quero transporta-la para Re maior.
Bem, o programa faz a substituição de tonalidade certa para algumas musicas, mas para outras , não substitui a tonalida e mantem a que estava. exemplo.
A musica parabéns, esta em Do maior, quero tranporta-la para Re maior
Parabéns em Do maior
C G
Parabéns pra você
C
Nesta data querida
F
Muitas felicidades
G C
Muitos anos de vida
Parabéns em Re maior
D A
Parabéns pra você
D
Nesta data querida
G
Muitas felicidades
A D
Muitos anos de vida
O problema é que tem algumas musicas, que o códico não faz a troca e mantem a nota original, só que mesmo nestas musicas, acontece a troca certa para algumas linhas e outras não.
Abaixo segue uma parte do programa onde executo as trocas de Do para Re, o restante do código são para outras notas e não são usadas neste caso, quando quero a troca do Do para Re.
Parte do código
private void btnokMouseClicked(java.awt.event.MouseEvent evt) {
// transporte de notas
String tomAtual = txttomatual.getText();
String tomNovo = txttomnovo.getText();
String texto = txtarea.getText(); // pego o texto da jTextArea
String[] linhas = texto.split("\n");
char Tom = 0;
for (int i = 0; i < linhas.length; i += 2) { // leio linha, somente a linha das cifras
int indice = 0;
StringBuilder sb = new StringBuilder();
while ((indice < linhas[i].length())) { // leio caracteres a caractertes
char nota = linhas[i].charAt(indice); //pego o caracter A,C,D,E.F.G... ... switch (tomAtual + tomNovo) {
//TOM DO
case "CD": // Se a musica esta no tom de C(DO) e eu quero
transporta-la para D (RE)
if (nota == 'A') { // caractere lido for um A, eu substituo por B
Tom = linhas[i].charAt(indice+1);
if (Tom == '#') {
sb.append("C");
indice=indice+1; //pulo o caracter # para não ser
impresso
}else {
sb.append("B");
}
} else if (nota == 'B') {
sb.append("C#");
} else if (nota == 'C') {
Tom = linhas[i].charAt(indice+1);
if (Tom == '#') {
sb.append("D#");
indice=indice+1;
}else {
sb.append("D");
}
} else if (nota == 'D') {
Tom = linhas[i].charAt(indice+1);
if (Tom == '#') {
sb.append("F");
indice=indice+1;
}else {
sb.append("E");
}
} else if (nota == 'E') {
sb.append("G");
} else if (nota == 'F') {
Tom = linhas[i].charAt(indice+1);
if (Tom == '#') {
sb.append("G#");
indice=indice+1;
}else {
sb.append("G");
}
} else if (nota == 'G') {
Tom = linhas[i].charAt(indice+1);
if (Tom == '#') {
sb.append("A#");
indice=indice+1;
}else {
sb.append("A");
}
} else {
//caso seja espaço em branco ou outro qualquer
sb.append(nota);
}
break;
.
.
.
continua ... para outras notas
.
.
.
default:
JOptionPane.showMessageDialog(null,"Caixa de entrada só
//aceita A,B,C,D,E,F,G");
indice=-2; //tive que colocar este codigo, para sair do while,
//caso contrario,a caixa de mensagem não sai da tela.
} // Fim Suitch
indice++; // leio o próximo caractere na linha
} // Fim while
txtarea.setText(txtarea.getText().replace(linhas[i], sb.toString()));
} // Fim For
obs : . Debuquei todo o código e vi que na linha abaixo
"txtarea.setText(txtarea.getText().replace(linhas[i], sb.toString()));"
o valor de "sb" é igual a linha das notas lidas já com as trocas das notas, na
"txtArea", o problema esta quando o código substitui as notas originais pela
novas notas na txtarea.
Alguém pode me dar um help ? muito obrigado.
Armando