Append dentro de um texto

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

Bloco de CitaçãoTexto pré-formatado``Texto pré-formatado

Para transformar o char ‘A’ em ‘B’, basta somar um:

char nota = linhas[i].charAt(indice); // supondo nota = 'A'
char novaNota = nota + 1; // novaNota = 'B'

Meu amigo Diego, boa noite, acho esse nome muito bonito, meu filho mais velho , se chama Diego.

Bom, o problema no código que mandei é que ele esta funcionando ate certo ponto bem, em algumas musicas, não da erro, mas em outras musicas, somente algumas linhas esta dando erro, ou seja, em vez dele substituir a nova nota, ele deixa a nota original, mas posso adiantar que o código onde o programa pega as nota para substituir a original, esta funcionando certo. ou seja;

“txtarea.setText(txtarea.getText().replace(linhas[i], sb.toString()));”

este código, o valor de “sb”, aparece com as notas substituidas, mas quando o programa grava na Textarea, a linha sai errado, fiz o debug linha a linha e pude verificar. Esta estranho, quando entro no codigo e esse pega a linha original e a substitui pela linha com as notas substituidas, o código faz isso certinho, inclusive “sb” esta com o valor correto, mas quando termina todas as linhas de serem lidas, o código deixa algumas linhas sem a modificação. Não sei se estou explicando direito, só sei que é um defeito intermitente, mas o erro existe.

obs : Não sabia se eu escrever o codigo abaixo.

                             char novaNota = nota + 1; // novaNota = 'B'

    Se o valor de nota for "A" e executar este código eu tenho o "B", bom saber disso, eu pensava que dava erro somar um char com um numero, para mim isso é uma boa novidade, valeu pela dica, gostei.

Armando.

Isto não funciona, pois linhas[i] pode ser qualquer linha do txtarea.

Construa uma String com o resultado final e por último adicione a string, não adicione enquanto está editando.

String musicaReMaior = "";
for (int i = 0; i < linhas.length; i += 2) { // leio linha, somente a linha das cifras
  musicaReMaior += novaNota + "\n"; // adiciona a nova nota
  musicaReMaior += linhas[i+1] + "\n";
}
txtarea.setText(musicaReMaior);
Diego, boa noite, primeiramente muito obrigado pela sua atenção e ajuda no meu problema, já estou a 4 dias no computador e nada. 

Bem, seguinte, não sei bem onde colocar o código que vc enviou, estou com várias duvidas, preciso tirar o "while" fora do código onde eu faço a pesquisa na txtarea para saber o valor das "notas" linha a linha e depois substituir com o valor que tenho de "sd"?

Embora tenha dado um erro, sei que fiz errado, deu para perceber que o código novo substituiu certo as notas, mas deu um problema com as linhas, creio que agora estou perto de solucionar este problema.

Abaixo mostro como eu inseri o código que vc me enviou.


            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;
                String Tonalidade = "";    //criei esta string com o nome de Tonalidade
		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.B,C,D,E.F.G, ..				switch (tomAtual + tomNovo) { 
                                     case "CD": // Tom de C e eu quero transporta-la para D
					if (nota == 'A') {
						Tom = linhas[i].charAt(indice+1);
                                                if (Tom == '#') {
						   sb.append("C");
                                                   indice=indice+1;
                                                }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;
                                    case "CE": //
					if (nota == 'A') {
						Tom = linhas[i].charAt(indice+1);
                                                if (Tom == '#') {
						   sb.append("D");
                                                   indice=indice+1;
                                                }else {
                                                    sb.append("C#");
                                               }           
					} else if (nota == 'B') {  
						sb.append("D#");
					} else if (nota == 'C') {
						Tom = linhas[i].charAt(indice+1);
                                                if (Tom == '#') {
						   sb.append("F");
                                                   indice=indice+1;
                                                }else {
                                                    sb.append("E");
                                               }           
					} else if (nota == 'D') {
						Tom = linhas[i].charAt(indice+1);
                                                if (Tom == '#') {
						   sb.append("G");
                                                   indice=indice+1;
                                                }else {
                                                    sb.append("F#");
                                               }           
					} else if (nota == 'E') {
						sb.append("A");
					} else if (nota == 'F') {
						Tom = linhas[i].charAt(indice+1);
                                                if (Tom == '#') {
						   sb.append("A");
                                                   indice=indice+1;
                                                }else {
                                                    sb.append("G#");
                                               }           
					} else if (nota == 'G') {
						Tom = linhas[i].charAt(indice+1);
                                                if (Tom == '#') {
						   sb.append("C#");
                                                   indice=indice+1;
                                                }else {
                                                    sb.append("C");
                                               }           
					} else {
						//caso seja espaço em branco ou outro qualquer
						sb.append(nota);
					}
					      break;
                                       default:
                                      JOptionPane.showMessageDialog(null,"Só aceita A,B,C, ..");
                                       indice=-2;
				} // Fim Suitch
                                Tonalidade += sb +"\n";
                                Tonalidade +=linhas[i+1]+ "\n"; 
				indice++; // leio o próximo caractere na linha
                                
			} // Fim while
			//txtarea.setText(txtarea.getText().replace(linhas[i], sb.toString())); 
                        
		} // Fim For
                txtarea.setText(Tonalidade);
    }  

OBS : As notas foram substituidas certo, icclusive em outras musicas que viam errada, 
  so que esta repetindo as linhas várias vezes, por favor, "onde foi que eu errei" ???? 

   Parabéns pra você

Parabéns pra você

Parabéns pra você

Parabéns pra você

Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D
Parabéns pra você
D A
Parabéns pra você
D A
Parabéns pra você

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida

Nesta data querida
D
Nesta data querida
D
Nesta data querida

Muitas felicidades

Muitas felicidades

Muitas felicidades

Muitas felicidades
Valeu meu camarada, muito obrigado, vou ficando por aqui para ver ase conserto este erro que eu fiz.

Armando.
    Amigo Diego, boa noite, parece que consegui, pelo menos agora veio certo as notas e as linhas, coloquei o comando no lugar certo, veja se é isso ?

           } // Fim while
        	//txtarea.setText(txtarea.getText().replace(linhas[i], sb.toString())); tirei esta linha
                  Tonalidade += sb +"\n";
                  Tonalidade +=linhas[i+1]+ "\n"; 
     } // Fim For
                    txtarea.setText(Tonalidade);
    }
    Deu certinho,

    D          A 
    Parabéns pra você
                   D 
    Nesta data querida
                  G 
    Muitas felicidades
           A        D 
    Muitos anos de vida
         D          A 
    Parabéns pra você
                   D 
    Nesta data querida
                  G 
    Muitas felicidades
           A        D 
    Muitos anos de vida

    fiz um teste em uma musica mais longa, onde dava erro em algumas linhas, fico 10 ! Show !  Agora vou fazer o teste com outras musicas e depois te passo o resultado. 

    Valeuuuuu !

Bom amigo, boa tarde

Funcionou, fiz vários testes e esta ok.

Muito obrigado pela ajuda, fique com Deus.

Armando.