juliocesarss
Segue abaixo um código que pode te ajudar.
[code]import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Partitura {
public static void main(String[] args) {
String musica = "Cm7 F# B E C#m7 F#/Bb E/B ";
Partitura partitura = new Partitura();
Map<String, String> dePara = partitura.nivelAToB();
String musicaAlterada = partitura.mudarMusica(musica, dePara);
System.out.println(musica);
System.out.println(musicaAlterada);
}
// Método para alterar a música
private String mudarMusica(String musica, Map<String, String> dePara) {
String musicaAlterada = musica;
Set<Map.Entry<String, String>> entry = dePara.entrySet();
for (Map.Entry<String, String> dado : entry)
musicaAlterada = musicaAlterada.replaceAll(String.format("( +|^)%s( +)", dado.getKey()), String.format("$1%s$2", dado.getValue()));
return musicaAlterada;
}
// Método para carregar o De >>> Para, das notas musicais.
private Map<String, String> nivelAToB() {
Map<String, String> notas = new HashMap<String, String>();
notas.put("Cm7", "C#m7");
notas.put("B", "B#");
return notas;
}
}
[/code]
O método nivelAToB tem como objetivo carregar um de/para das notas, ou seja Cm7 um nível acima é C#m7 e todas as outras regras, neste caso, se o sistema tiver mais de uma alteração de nível, o mesmo pode ser utilizado para carregar outros de/para.
Mas caso seja possível vários níveis, ao invés de fazer tudo em apenas um método é mais interessante criar interface de escala musical, assim cada nível da escala implementa o seu de/para. (mas isto é algo que pode ser feito depois, primeiro vamos tentar fazer da forma mais simples)
O método mudarMusica, vai percorrer o de/para e mudar todas as notas, e no final retornar a música alterada.
Nos testes que realizei funcionou ok, porem não tenho domínio da regra de negócio, então neste caso não sei se vai contemplar todas as regras !!! Para isto é necessário você passar mais detalhes desta “conversão” de níveis e suas particularidades.
Por exemplo fiquei na dúvida se E/B aumentado um nível é E/B#, ou E#/B#, etc etc.
Mas a princípio acredito que este método e com as dicas do pessoal, você já consiga elaborar uma solução, fazendo o loop por toda a musica e mudando a mesma.
Dependendo da regra vai ser necessário mexer nesta expressão regular b%s( +)[/b], que é utilizada pelo método mudarMusica
OBS: O código que mostrei tem algumas coisas que podem ser melhoradas, como é o caso de usar StringBuilder ao invés de String, etc etc… !!! mas neste caso fica estas alterações e melhorias para você fazer.
Att