Language…
21 users online: akawo, Alex No,  AmperSam, CharlieUltra, DanMario24YT, deadworld2009,  DeppySlide, edgar, Green, Hammerer, Heitor Porfirio, JezJitzu,  MarioFanGamer, Metal-Yoshi94, MistaX88, Nayfal, Pink Gold Peach,  Telinc1, timeisart, Tulip Time Scholarship Games, wye - Guests: 287 - Bots: 453
Users: 64,795 (2,370 active)
Latest user: mathew

Tutorial Básico de Como Portar Músicas para AddmusicK

  • Pages:
  • 1
  • 2


Tutorial Básico de Como Portar Músicas para AddmusicK


Básico porque não vou cobrir ports sampled, nem vou colocar muitas imagens e exemplos por enquanto. De qualquer forma espero que isso ajude.

Requisitos

Você vai precisar de:

  • FL Studio (recomendado) ou Anvil Studio. O primeiro é pago, mas você pode conseguir por métodos alternativos
    ;)
    , enquanto que o segundo é de graça. Nesse tutorial usarei o FL como referência.
  • AddmusicK (AMK) na versão mais recente. Você o encontra na seção de ferramentas da SMW Central.
  • Versão modificada do PetiteMM (modificação pelo usuário Crispy), se optar por converter as MIDI's mais rapidamente. Você provavelmente precisará ter Java e Python instalados para poder usar.
  • SPC700 Player, para poder escutar seus ports. Faça com que ele seja o programa padrão para abrir suas SPC's. Você também o encontra na seção de ferramentas da SMW Central.
  • Lista útil de comandos e parâmetros. Note que boa parte dessa lista já se encontra no Readme do AddmusicK, e atualizada. Porém, ela ainda tem informações que serão úteis que não estão lá.
  • Uma MIDI o mais precisa o possível da música que você quer, de preferência rippada (retirada) do jogo original. Uma boa parte dos consoles (especialmente os clássicos) usa música sequenciada, que pode ser facilmente convertida em MIDI (rippada) com os programas certos. MIDI's imprecisas têm notas erradas e afins, o que te força a consertá-la no FL Studio, ou no TXT (MML) para que o port fique legal. Um site que muitos gostam de usar para pegar MIDI's é o VGMusic, porém muitas das MIDI's de lá ou são remixes, ou são incompletas (instrumento faltando) ou são ligeiramente alteradas para contornar problemas com direitos autorais. Tente procurar na internet afora (Google, YouTube) se você não tiver alternativas boas para MIDI's rippadas. Recomendo começar com músicas mais simples (8-bit, por exemplo), para você se confundir o mínimo o possível enquanto aprende e se acostuma.
  • Bloco de Notas ou qualquer ferramenta que lhe permita editar arquivos TXT.
  • Recomendado: ter uma noção da sintaxe MML. Para isso sugiro ler todo o Readme do AddmusicK. Esses tutoriais antigos também podem ajudar: Tutorial do S.N.N. e Supertails, e o do MVS (agora Sinister Pixel).
  • Recomendado: programas que rippam (retiram) músicas de jogos em formato MIDI, como o VGMTrans, GBA Mus Riper (sim, com um p), N64 Midi Tool, entre outros que eu não me lembro agora.
  • Opcionais: BRR Player, MML Editing Tool. O uso de ambos fica mais claro na parte de Instrumentos e ADSR.
  • MUITA paciência.

Obs.: note que você não vai precisar muito de conhecimentos sobre teoria musical para portar decentemente. Portanto se você for leigo em música, fique tranquilo. Mas caso você tenha esses conhecimentos, isso obviamente vai ajudar em alguns aspectos.

Introdução

No mundo afora existe uma outra denominação para as notas musicais (Do, Re, Mi, etc), que é à base de letras do alfabeto. Uma oitava de notas é, em ordem crescente de pitch (altura, tom): c - c# - d - d# - e - f - f# - g - g# - a - a# - b. Exemplos de notas e rests (descanso, espaço vazio entre notas) em MML:

a1 -> nota inteira de a
c+4 -> um quarto de nota de c#
e2^8 -> 1/2 + 1/8 de nota de e
r8^16^32 ou r8.. -> 1/8 + 1/16 + 1/32 de nota de um rest

Atenção! c2^4 é diferente de c2c4 por exemplo; a primeira é uma nota só e a segunda são duas notas!

Note que a duração da nota (número depois da nota) não pode ser diferente de um divisor comum de 192, geralmente sendo uma potência de 2 (até 64). Esse número representa o denominador de uma fração, portanto quanto maior seu valor, menor a duração da nota. Só isso já deve deixar as coisas um pouco mais claras.

Preparando a MIDI

Abra a sua MIDI com o FL Studio: File -> Import -> MIDI file... (selecione sua MIDI) -> desative a opção "Create one channel per track" -> Accept.

Foque sua atenção na janela do Channel Rack e clique nos retângulos da direita para acessar o Piano Roll de cada canal (no Anvil Studio você também pode acessar o Piano Roll). Nesse modo você consegue facilmente: ver as notas e suas durações, os rests (descansos, espaços vazios) entre as notas e suas durações. A duração de uma nota inteira no FL Studio é o espaço entre dois números na aba de cima do Piano Roll. Clicando no nome dos canais no Channel Rack, você consegue ver algumas informações relevantes, como o instrumento musical que está sendo usado para os mesmos.

Deixe a janela do programa aberta como referência e abra outra do programa (minimize e abra o FL de novo) com essa mesma MIDI. Salve essa outra como um projeto (.flp) separadamente, pois nessa você irá fazer modificações para poder converter. Você também pode salvar a MIDI original como um projeto para não ter que ficar importando a mesma toda hora que for abrir o programa.

Verifique se a MIDI está precisa com relação à música original, ou seja, se as notas estão corretas. Caso contrário, conserte as notas ou procure uma MIDI melhor.

Muitas vezes as durações das notas não estão adequadas. Isso acontece principalmente nas notas de percussão, uma vez que a MIDI usa um valor padrão de duração para elas, independente de como elas estejam no Piano Roll. Selecione as notas e ajuste suas durações nesses casos. Caso você não tenha ideia se essas durações estão adequadas ou não, você pode optar por consertá-las depois, no TXT. Geralmente é uma boa ideia extender a duração das notas de percussão o máximo possível (sem que elas se sobreponham) para eliminar os rests e para garantir que a duração das notas seja suficiente para que os instrumentos percussivos toquem totalmente.

Se a música tiver loops na MIDI (a mesma MIDI toca a música mais de uma vez), remova tudo que esteja depois do primeiro loop, ou seja, tudo depois do término da música, se tocada uma só vez. Ao portar, as músicas automaticamente fazem o loop assim que elas terminam. Veremos mais sobre isso depois.

Rearranje a MIDI de forma que ela tenha no máximo 8 canais (muitas músicas exigirão isso de você). O chip de som do SNES (SPC700) só é capaz de tocar 8 canais monofônicos, isto é, cada canal não pode tocar 2 ou mais notas simultaneamente (acorde). No FL Studio você deve separar esses acordes em canais diferentes. Agora, para reduzir o número de canais a 8, você deve: encaixar notas de um outro canal que você queira se livrar, na mesma posição no Piano Roll de um canal que você irá manter. À medida que você vai fazendo isso, você vai esvaziando canais sem perder notas. Tenha em mente que 2 dos 8 canais também são usados por efeitos sonoros (SFX) no jogo, por isso tente deixar dois canais com as coisas mais silenciosas ou menos relevantes para a música. Quanto mais rests nesses canais, melhor. Fique atento a quais instrumentos essas notas que você moveu estavam associadas (anote!), de forma que, no TXT, você saberá definir os instrumentos corretos dessas notas. Terminado isso, delete os canais vazios. Algumas vezes terão canais completamente irrelevantes que você poderá deletar diretamente. Se mesmo assim você precisar deletar notas, dê preferência às notas menos importantes de um acorde, ou qualquer outro tipo de nota que seja menos audível ou relevante na música.

Para ilustrar esse último conjunto de passos, observe nessa figura como o Channel Rack desse port era antes e depois desse remanejamento e redução de canais.

Com isso feito, você já pode fazer o que interessa: portar a MIDI. Você tem duas escolhas agora: portar a mão (interessante para iniciantes se acostumarem) ou exportar essa MIDI para converter com o PetiteMM. Antes de exportar, certifique-se de deixar os canais que se deseja ter na MIDI habilitados (lado esquerdo do Channel Rack), e certifique-se de que todos sejam do plugin MIDI Out. Para exportar: File -> Export -> MIDI file -> Start.

O PetiteMM modificado só converte informações de: notas e suas durações, rests e suas durações, tempo, mudanças de oitava, velocities (velocidades/volume das notas) e panning (balanço de estéreo). Portanto esteja preparado para trabalhar no port, mesmo o usando.

A partir de agora você vai precisar um pouco de conhecimentos sobre a sintaxe MML que mencionei antes.

Usando o PetiteMM

Crie uma pasta onde você desejar e extraia o conteúdo do ZIP da versão modificada do PetiteMM. Coloque a sua MIDI nessa mesma pasta.

Dentre os arquivos extraídos, existem três arquivos BAT: pmm.bat, pmm_decvol.bat, e pmm_hexvol.bat. Os arquivos decvol e hexvol exportam MML's com as velocities de cada nota, no formato decimal (vXXX) pelo decvol, ou no formato hexadecimal (qXY) pelo hexvol. Os valores de panning são exportados contanto que a mudança de panning não ocorra enquanto a nota estiver tocando, num dado canal. Dentre esses três arquivos o que eu recomendo é o hexvol, porque vXXX e qXY são comandos independentes de volume do canal, e é melhor deixar o vXXX por conta do volume do canal inteiro e qXY por conta do volume de cada nota (velocity) nesse canal. Isso se deve a duas razões: 1) nesse formato você terá poucos vXXX e muitos qXY, que é melhor que muitos vXXX, já que vXXX gasta mais bytes de espaço do que qXY; 2) vXXX tem maior precisão do que qXY, uma vez que vXXX vai de 0 a 255, enquanto que qXY vai de 0 a F (15 em hexadecimal) e é melhor ter precisão no volume do canal do que no volume de cada nota.

Clique no arquivo BAT com o botão direito do mouse e selecione Editar. Você verá algumas opções do programa em cada linha com ::. A última linha é a responsável por rodar o programa, com as opções de sua escolha. Para pmm_hexvol.bat eu recomendo a seguinte configuração:

Code
pmm.jar --no-quantize --use-hex-velocity --octave-reverse NomeDaSuaMIDI.mid

pmm.jar chama o programa. --no-quantize impede que o PetiteMM modifique a quantização das notas e rests da sua MIDI, ou seja, as durações serão preservadas. --use-hex-velocity fará com que o programa converta as velocities em formato hexadecimal (qXY). --octave-reverse deixa as mudanças de oitava no formato correto em MML. NomeDaSuaMIDI.mid chama a sua MIDI (no lugar de "NomeDaSuaMIDI" coloque o nome da sua MIDI, e certifique-se de que ele não contenha espaços, porque senão eu acho que o programa terá problemas). Salve o arquivo BAT e feche-o. Agora execute-o.

Você obterá um arquivo MML com o mesmo nome da sua MIDI e na mesma pasta.

Preparando o TXT

Se você optou por converter a MIDI com o PetiteMM, siga os três procedimentos a seguir:

1) Se você não tiver Python instalado, abra o MML com o Bloco de Notas e vá em Editar -> Substituir... (Ctrl + H). No campo "Localizar" coloque "^b", sem aspas, e no campo "Substituir por" coloque "^", sem aspas. Aperte "Substituir Tudo". Repita o processo, mas agora com "^a+" no campo "Localizar". Faça isso passando por todas as notas, nessa ordem: b, a+, a, g+, g, f+, f, e, d+, d, c+, c. Esse procedimento serve para consertar um erro do PetiteMM em que ele incorpora durações de nota da seguinte forma: b16^b32. Isso está errado porque, na sintaxe MML, depois dos ^ sempre deve ter um número, nunca uma letra. Alternativamente, se você tiver Python instalado, arraste o arquivo MML que você acabou de gerar e solte sobre o arquivo pmm.py, que veio incluso no zip do PetiteMM modificado. Isso rodará um script que fará esse conserto automaticamente!

2) Abra o MML com o Bloco de Notas e salve-o como um arquivo TXT (formato que o AddmusicK reconhece) na pasta music do AddmusicK. Para isso basta apenas mudar a extensão de .mml para .txt.

3) Em seguida, livre-se dos dois tempos repetidos no topo (tXXtXXtXX) e de outras coisas como os @30 em cada canal - cada canal inicia com #X (#0, #1, #2, etc.) e termina com ;. Esse ponto e vírgula é só um comando de comentário, ele não define onde termina cada canal. Separe os canais com umas quebras de linha para poder identificá-los mais facilmente depois. Você provavelmente terá que mudar os valores de oX (o3, o4, o5, etc.) no começo de cada canal depois. Os comandos de tempo (tXX), instrumento (@XX), canal (#X) e oitava (oX) são explicados posteriormente no tutorial.

Se você optou por portar manualmente, crie um arquivo TXT na pasta music do AddmusicK.

Os procedimentos a seguir devem ser feitos independentemente de você ter usado PetiteMM ou não.

Topo e Canais

No seu TXT, a primeira coisa que você deve fazer é, no topo do arquivo, definir os comandos especiais (special commands). O comando especial mais importante de se ter no nosso caso é: #amk 2. Veja no Readme do AddmusicK outros comandos especiais que você talvez queira/precise usar.

Em seguida, defina os comandos globais, como: volume global (wXXX), tempo (tXX), e eco*.

O volume global (wXXX) controla o volume da música inteira e vai de 0 a 255, ou seja, w0 a w255. Seu valor fica a seu critério.

O tempo (tXX) é basicamente a velocidade da música. Para definí-lo, vá no FL Studio e, no topo da janela do programa, ache o tempo em BPM (figura do Channel Rack). Para converter para o valor usado em MML, pegue esse valor em BPM e multiplique por 0,4096. Exemplo:

tempo em BPM é 125 -> multiplica 125 por 0,4096 -> resultado: 51,2 (arredondado fica 51) -> seu tempo em MML será t51

Agora, no topo de cada canal deve-se ter o comando que define o mesmo (#X, onde X vai de 0 a 7). O primeiro canal é #0 e assim por diante. Um canal só termina quando um outro começa, sendo que o último canal termina no final do TXT. Note que os canais #6 e #7 são os que tocam efeitos sonoros (SFX), como dito anteriormente em Preparando a MIDI. Se sua música tiver até 6 canais apenas, não deixe nenhum canal como #6 ou #7. Dessa forma esses dois ficam só por conta dos SFX.

*Comando de eco (veja no Readme do AMK o que cada parâmetro representa):
$EF $XX $YY $ZZ
$F1 $XX $YY $ZZ

O parâmetro que define quais canais terão eco (o $XX depois do $EF) é um pouco mais trabalhoso de se obter: pense que os canais estão em ordem decrescente, ou seja, 76543210. Para cada canal que não terá eco, você atribui o valor 0, e para cada que terá eco, você atribui 1. Com isso você terá um número binário de no máximo 8 dígitos. Abra uma calculadora com modo de programador (a do Windows, por exemplo), coloque no modo binário e escreva esse número. Por fim, converta-o a hexadecimal. Esse número em hex é o que você usará no comando de eco. Exemplo:

Canais #0, 2 e 5 terão eco -> número em bin: 00100101 ou 100101 -> número em hex: 25 -> $EF $25 $YY $ZZ

Instrumentos e ADSR

Defina os instrumentos (@XX) que começarão a tocar em cada canal. Se tiver portando sem custom samples, ou seja, sem instrumentos que não sejam do SMW (unsampled), escolha os que mais se pareçam com os que são usados na música a se portar. O MML Editing Tool possui uma ferramenta que chama Sample Player, e nela você consegue ter uma noção de como que cada instrumento do SMW soa (não recomendo usar esse programa para algo além disso). Outro método seria escutar as BRR's das samples, que você encontra na pasta samples que vem com o AMK. Para abrí-las, use o BRR Player. Cuidado com o volume, lol. Aprenda a brincar com esse programa caso você queira mexer com samples depois.

No processo de remanejamento e remoção de canais da MIDI, você muito provavelmente colocou notas em canais que usam instrumentos diferentes dos canais de origem dessas notas. Por causa disso você frequentemente terá que mudar de instrumentos no meio de um canal do seu TXT. Use a anotação que falei para você fazer anteriormente enquanto preparava a MIDI.

Toda vez que você define um instrumento (@XX), é carregado automaticamente o valor de ADSR ou GAIN padrão do mesmo. Essas duas coisas são responsáveis pelo modo como o volume das notas se comporta enquanto elas são tocadas. O BRR Player te permite brincar com essas coisas também. Os ADSR's e GAIN's padrões de cada instrumento do SMW estão na Lista Útil que disponibilizei. Você quase sempre terá que alterar esses valores quando for definir instrumentos. Às vezes você terá que alterá-los sem mesmo trocar de instrumento. O comando de ADSR é em hex: $ED $DA $SR, onde $ED inicia o comando, "A" é o Attack, "D" o Delay, "S" o Sustain e "R" o Release. O Attack e o Release são os mais importantes e também os mais fáceis de entender: o Attack controla a velocidade com que o volume da nota chega ao seu máximo e o Release controla a velocidade com que o volume da nota diminui depois de tocar. Os outros parâmetros são mais difíceis de explicar, apenas experimente com eles. Refira-se ao Readme do AMK para saber mais.

Valores diferentes de ADSR podem fazer o instrumento soar completamente diferente, podendo simular até mesmo outros instrumentos. Esse tópico contém alguns desses valores notáveis de ADSR num formato que você possa usar como instrumentos customizados (comando especial #instruments). Para entender como fazer instrumentos customizados, refira-se ao Readme do AMK. Eles são bastante úteis não apenas para ports sampled, mas também para unsampled, se quiser criar "instrumentos novos" a partir dos originais.

Comandos Comuns

Outros comandos essenciais de se ter no canal são: volume do canal (vXXX), panning (balanço de estéreo, yXX), quantização (qXY), oitava (oX), subir de oitava (>) e descer de oitava (<). Você comumente terá que alterá-los a todo momento no mesmo canal, principalmente ao mudar de instrumento.

O volume do canal (vXXX) vai de 0 a 255.

qXY também pode ser usado para mudar o volume, alterando o valor Y, que vai de 0 a F em hex. O valor X controla o staccato das notas subsequentes, ou seja, o quanto das notas será efetivamente tocado. Esse valor vai de 0 a 7, sendo a nota tocada por inteiro em 7. Esse comando é independente de vXXX (um não substitui o outro) e consome menos bytes da ARAM (Audio RAM), porém ele é menos preciso. Recomendo usar a parte de volume do qXY apenas para as velocities das notas, como disse em Usando o PetiteMM.

O comando de panning (balanço de estéreo, yXX) vai de 0 a 20. Em y10 o volume do canal estará totalmente centralizado. Em y0 ele estará todo para a direita, e em y20 todo para a esquerda.

Use o oX no início de cada canal, escolhendo um valor adequado, indo de o1 a o6. quanto mais baixo, mais grave serão as notas, e vice-versa. Controle as mudanças de oitava no canal com > e <. Pode usar mais de uma vez para abaixar ou subir 2 ou mais oitavas. Vale mencionar que as oitavas têm limites, tanto inferior quanto superior. Esses limites dependem das samples associadas a cada instrumento. Se passar desses limites o AMK vai mostrar um erro falando que o pitch das notas em uma certa linha do TXT ficou baixo/alto demais. Para consertar, verifique se o canal inteiro está com a oitava (oX) errada, ou se foi só em uma parte. Se for só em uma parte, controle adicionando ou removendo > ou <, ou defina a oitava correta com oX. Vale mencionar que a nota máxima que você pode ter em MML é uma nota a em oitava 6.

Muitas vezes você terá que usar uns hex commands também. Os mais comuns são ADSR ($ED $DA $SR), vibrato ($DE $XX $YY $ZZ), pitch bends/slides ($DD $XX $YY $ZZ), fades de volume (tanto global quanto do canal), pan sweep, echo toggle (para ligar ou desligar eco em um canal). Você comumente terá que ligar ou desligar esses comandos quando mudar de instrumentos, pois cada instrumento "pede" uma coisa diferente. Todos os comandos estão listados no Readme do AddmusicK. Não hesite em aprender a usá-los, e a brincar com seus valores. Obs.: o pitch bend ($DD $XX $YY $ZZ) é um pouco diferente da maioria dos comandos, porque ele sempre deve ser definido no meio de uma nota, e não entre notas. Mais detalhes de como usá-lo são mostrados posteriormente na parte de Dicas.

Looping da Música

Como dito anteriormente em Preparando a MIDI, assim que a música acaba ela faz o loop automaticamente. Porém, esse loop acontece assim que o canal com menor duração termina de tocar, o que pode fazer com que a música inteira faça o loop prematuramente. Para arrumar isso você deve fazer com que todos os canais tenham a mesma duração, ou que o canal com a maior duração se transforme no que tenha a menor. Para isso verifique o final da MIDI no FL Studio, olhando qual(is) canal(is) tocam as últimas notas da música. No TXT adicione rests nos canais com menor duração de forma que eles tenham duração igual ou maior ao(s) que tem as últimas notas. Você pode exagerar nessa quantidade de rests, algo como, por exemplo: [r1]99. r1 é um rest com duração de uma nota, e []XX é o comando de loop, ele repete tudo que está dentro dos colchetes um número XX de vezes (no caso 99 vezes, lol). Depois, na hora de testar o port, tenha certeza de que o loop do port está de acordo com a música original.

Você já deve ter percebido que muitas músicas começam com uma parte e, depois de terminar, elas recomeçam numa parte adiante, sendo que aquela primeira não toca mais. Para separar essa parte que só toca uma vez na música do resto, utiliza-se o comando de intro (/). O / deve ser inserido em cada canal, e entre as notas do término da intro e do começo do loop da música. Olhe a MIDI no FL Studio para identificar onde exatamente você deve posicioná-lo em cada canal. Tenha o cuidado de fazer isso corretamente, ou seja, deixando a intro com a mesma duração para todos os canais. Caso contrário, ao fazer o loop, os canais vão dessincronizar entre eles!

Economizando Espaço

ROM e ARAM

Como você já deve imaginar, tudo que você faz no TXT consome espaço, ou da ROM ou da ARAM. Para ports unsampled você não precisará se preocupar com o segundo, pois o que mais consome ARAM são custom samples. O parâmetro echo delay do comando de eco também consome bastante, mas ainda assim não será um problema para ports unsampled. Para mais informações sobre o consumo de ARAM, refira-se ao Readme do AMK. Vamos nos focar aqui em economizar o espaço da ROM que o port irá gastar. Os canais de percussão geralmente são os que mais têm repetições, portanto sendo os que mais desperdiçam espaço.

Atenção! Ao contrário do que muitos pensam, o comando de duração padrão (lXX) não economiza espaço da ROM!

Normal Loops

O AddmusicK vem com comandos de loops úteis para o caso de partes do TXT que têm notas (e comandos associados) se repetindo. Um exemplo já foi visto, que é o comando de loop normal: []XX que repete tudo que está dentro dos colchetes um número XX de vezes. Ou seja, quando você tem notas ou partes que se repetem seguidamente, você pode usar esse comando para que tudo seja lido apenas uma vez, e depois repetido. Isso fica mais fácil de entender com exemplos:

c16c16c16c16c16c16c16c16 -> [c16]8

c+4^16<b16b8> \
c+4^16<b16b8> | -> [c+4^16<b16b8>]3
c+4^16<b16b8> /

@21 $ED $7D $E8 v150 d8r8 @22 $ED $7F $E0 v225 d16r16 \
@21 $ED $7D $E8 v150 d8r8 @22 $ED $7F $E0 v225 d16r16 / -> [@21 $ED $7D $E8 v150 d8r8 @22 $ED $7F $E0 v225 d16r16]2

Atenção! Você não pode colocar loops normais dentro um dos outros (nesting). Para isso usamos os superloops, que veremos depois.

Encurtando Rests

Os rests têm a propriedade de poderem ser combinados em um só (com uma duração combinada deles) se estiverem seguidos um do outro, o que não pode ser feito para notas normais. Mas eles também podem ser divididos, o que pode ser útil em alguns casos. Por exemplo:

r1r2r4r16 -> r1^2^4^16

r1^1^1^1^1^1^1^1^4 -> r1r1r1r1r1r1r1r1r4 -> [r1]8 r4

Uma coisa interessante que poucos sabem é que um r1 é tecnicamente dois r2 combinados. Portanto podemos economizar ainda mais espaço dividindo aquele último r1 em dois r2:

[r1]8 r4 -> [r2r2]8 r4 -> [r2]16 r4

Label Loops

É um tipo de loop que você pode "chamar" a qualquer momento depois que ele é definido. É útil para partes que aparecem constantemente depois, mas que não são seguidas. Usa-se (YY)[]XX para definir o label loop, onde YY é o número da label, dentro dos colchetes fica a parte que se repete e XX é o número de vezes que aquela parte se repete logo quando se definiu o label loop. Use esse comando na primeira instância da parte que se repete no canal. Usa-se (YY)ZZ depois para chamar essa parte, sendo ZZ o número de vezes que ela se repete ali onde foi chamada. Exemplos:

@1 v180 a8b8r8>c8<b8
@6 v160 >c8d8e8r8f8e8<
@1 v180 a8b8r8>c8<b8
@4 v140 r4f+8g+8


se torna:

(1)[@1 v180 a8b8r8>c8<b8]
@6 v160 >c8d8e8r8f8e8<
(1)
@4 v140 r4f+8g+8


---------------------------

@1 v180 a8b8r8>c8<b8a8b8r8>c8<b8a8b8r8>c8<b8
@6 v160 >c8d8e8r8f8e8<
@1 v180 a8b8r8>c8<b8a8b8r8>c8<b8
@4 v140 r4f+8g+8


se torna:

(20)[@1 v180 a8b8r8>c8<b8]3
@6 v160 >c8d8e8r8f8e8<
(20)2
@4 v140 r4f+8g+8


Como fazer label loops com mais praticidade: utilize a função "Substituir..." (Ctrl + H) do Bloco de Notas. No campo "Localizar" coloque a parte que se repete e no campo "Substituir por" coloque a label que chama essa parte. Faça manualmente se quiser evitar qualquer problema.

Atenção! Você não pode colocar loops normais dentro de label loops. Além disso, label loops preservam a oitava de quando eles são definidos, então tenha cuidado com isso ao usá-los (use oX para consertar a oitava depois do label loop ser chamado, se necessário). Por esse motivo também não recomendo chamar um label loop em canais diferentes de onde ele foi definido.

Superloops (ou Subloops)

São simplesmente loops que você pode colocar dentro de loops normais ou colocar loops normais dentro destes. Também funcionam com label loops! O comando é [[]]XX, onde a parte que se repete fica dentro dos colchetes duplos e XX é o número de vezes que ela se repete. Exemplos:

a16r16c16r16c16r16c16r16d16r16 \
a16r16c16r16c16r16c16r16d16r16 / -> [ a16r16 [[c16r16]]3 d16r16 ]2 ou [[ a16r16 [c16r16]3 d16r16 ]]2

---------------------------

@1 v180 a8b8r8>c8c8c8c8<b8
@6 v160 >c8d8e8r8f8e8<
@1 v180 a8b8r8>c8c8c8c8<b8
@4 v140 r4f+8g+8


se torna:

(300)[@1 v180 a8b8r8> [[c8]]4 <b8]
@6 v160 >c8d8e8r8f8e8<
(300)
@4 v140 r4f+8g+8


---------------------------

(300)
v140 c8r8
(300)
v140 c8r8


se torna:

[[ (300) v140 c8r8 ]]2

Atenção! TODOS os comandos de loop gastam espaço por si só, então apenas use-os quando você perceber que a economia de bytes compensará os bytes que você gastará usando-os. Por exemplo, os loops normais gastam algo em torno de 6 bytes, então NÃO faça algo como [c4]2, pois isso gastará mais bytes do que se você deixasse como c4c4. Agora, se você tiver algo como [c4]8 ao invés de c4c4c4c4c4c4c4c4, provavelmente você já terá economia. Na dúvida, na hora de testar seu port, você pode consultar o espaço gasto pela ROM na pasta stats do AMK. Se "SONG TOTAL DATA SIZE" aumentar com o seu loop, significa que ele não compensa. Os arquivos stats são explicados mais adiante em Testando o Port.

Exemplo

Tome como um exemplo geral de port, o topo e os canais #0 e #6 desse port meu:

TXT (parcial) | SPC (completa)

Se quiser, deixe apenas os canais 1 e 7 habilitados no SPC Player, para ilustrar o que está no TXT. E não se assuste com os valores de duração nesse port: usei o PetiteMM e, ao converter a MIDI, ele gerou esses valores automaticamente. Como disse anteriormente, os valores de duração podem ser quaisquer divisores comuns de 192, isso inclui 3, 6, 12 e afins.

Testando o Port

Para testar os seus ports, basta adicionar o seu TXT à lista de ports no AMKGUI, ativar a opção "Porter mode" (deixe "Autoplay SPC" ativado também) e rodar o programa. Nesse modo o AMK não irá inserir seu port na sua ROM, mas irá rodá-lo como se ele tivesse sido inserido. Ou seja, as músicas globais que você escolheu para a sua ROM serão consideradas. Caso você queira que as músicas globais originais do SMW sejam consideradas nesse teste, extraia os conteúdos do ZIP do AMK em outra pasta e use uma ROM que não tenha modificações nas músicas lá. Isso é importante no caso de você querer mandar ports para a seção de música do site.

Caso haja alguma coisa errada com o seu port, o AMK irá mostrar uma mensagem de erro e não irá modificar sua ROM, portanto não precisa se preocupar com backups. Se o erro for específico de alguma linha do seu TXT, ele irá dizer em qual está. Vá em Exibir -> Barra de Status no Bloco de Notas para poder ver o número das linhas e achar o erro (desabilite "quebra automática de linha"). Se não houver erros, o SPC Player irá abrir e tocar seu port. Não se preocupe, você não irá acertar o port de primeira: ele provavelmente vai soar esquisito e barulhento inicialmente, mas fique atento ao SPC para entender o que você fez errado. Portar músicas é um processo com bastante tentativa e erro. Se você se dedicar, uma hora você consegue fazer soar do jeito que deveria.

Uma vez rodado pelo AMK, o programa cria um TXT com informações sobre o seu port na pasta stats. Dentre essas informações você encontra o tamanho de inserção do seu port ("SONG TOTAL DATA SIZE"), ou seja, o espaço da ROM que ele gasta, além dos ticks (duração) de cada canal, que você pode usar para consertar o looping da música, caso ele esteja errado. Ele provavelmente estará errado se o canal com as últimas notas da música tiver um número de ticks maior do que os outros.

Dicas

Aqui vai algumas dicas:

- Deixe o looping da música e a economia de espaço para o final. Preocupe-se primeiro em fazer o port funcionar e soar corretamente.

- Você pode ativar comandos no meio de uma nota, ou seja, enquanto ela é tocada. Isso será necessário para fazer pitch bends corretamente, por exemplo. Outros comandos que você provavelmente usará dessa forma em alguma hora são ADSR e volume fade. Exemplo com pitch bend:

o3 d+8 $DD $18 $30 $9F ^4 ou o3 d+8 $DD $18 $30 g ^4 ; Repare que a nota originalmente seria d+4^8, porém no primeiro 1/8 ela é d+ ($18 de delay), enquanto que no 1/4 seguinte ($30 de duration) ela sofre um pitch bend, e progressivamente vira uma nota g da mesma oitava ($9F). Nesse caso, se você quisesse que fosse uma nota g de oitava diferente, você poderia colocar > ou < antes do g. Por exemplo, se você quisesse que esse pitch bend fosse de d+ na oitava 3 para g na oitava 5, você poderia fazer o3 d+8 $DD $18 $30 >>g ^4. Obs.: você não precisaria colocar o3 antes de d+ se ela já estivesse na oitava 3. Obs.2: o parâmetro de delay é o que determina de fato quando o pitch bend irá iniciar. No exemplo, o $18 de delay (que equivale a 1/8 de nota) dita que o pitch bend só se iniciará depois que 1/8 de nota já tiver passado desde que você chamou a nota d+. Se o delay fosse de $0C (que equivale a 1/16 de nota), o pitch bend se iniciaria depois que 1/16 de nota tivesse passado desde que você chamou a nota d+.

- Use o ; (comando de comentário) para destacar coisas importantes no TXT, como o instrumento associado a um canal, ou uma mudança de instrumento, ou partes de referência da música para se localizar melhor, etc.

- Quanto mais alto o pitch de uma nota, mais estridente é o som. Para contrabalancear isso, diminua o volume dessas notas (com vXXX ou qXY), lembrando de voltar o volume ao original quando estas terminarem de tocar.

- Notas de longa duração podem soar bastante "cansativas" ao ouvido. Você pode nesses casos usar ADSR com um valor de Release maior e/ou usar um leve vibrato ($DE $XX $YY $ZZ), com ou sem tremolo ($E5 $XX $YY $ZZ). Estes últimos são interessantes porque um causa pequenas flutuações no pitch, enquanto que o outro causa pequenas flutuações no volume. Isso alivia aquela continuidade do som de uma nota longa.

- No caso de ocorrerem notas que pareçam tocar mais brevemente do que deviam, certifique-se de que elas estejam com a duração correta. Nesse caso, é muito comum você encontrá-las assim por exemplo: c8r8d8r8f+8r8 etc. Quando for assim você pode extender suas durações, removendo os rests no processo. Por exemplo:

c8r8d8r8f+8r8 -> c4d4f+4

Como fazer isso de um jeito menos tedioso? Simples: utilize a função "Substituir..." (Ctrl + H) do Bloco de Notas. Seguindo o exemplo anterior, no campo "Localizar" coloque "8r8" e no campo "Substituir por" coloque "4". Faça as substituições tomando o cuidado para não substituir aonde não se deve, ou seja, aonde as notas devem ser separadas por rests! Se quiser garantir-se de que você não vai fazer substituições indevidas em outras partes do seu TXT, você pode cortar o que você quer mexer, colar em um documento em branco, fazer as substituições lá e depois cortar e colar de volta no TXT do seu port.

- Notas seguidas de rests seguindo um certo padrão como no item anterior indicam um caso de staccato. As notas deixam de tocar um certo tanto definido pelo tamanho dos rests que as acompanham. Como vimos anteriormente, o valor X do comando qXY controla o staccato das notas subsequentes. Com ele você pode incorporar os rests nas durações das notas e controlar diretamente o quanto das notas será tocado apenas mudando o valor de X, que vai de 0 a 7. Quanto menor o valor, mais as notas serão cortadas.

- Algumas vezes a percussão de uma música requer que você mude de instrumentos continuamente em um só canal, sendo cada nota associada a um instrumento diferente. Para não ter que ficar mudando os comandos de instrumento, ADSR, volume, etc. para cada nota, você pode usar o comando de substituição (replacement) "=" no topo do TXT para definir uma palavra que substituirá todos esses comandos no TXT, deixando as coisas mais organizadas. Veja mais a respeito no Readme do AMK. Exemplo:

"LCBL=@22 $ED $7F $E0 v170"
"CLHH=@23 $ED $7F $E0 v190"

#amk 2

[etc.]

#5 y10

LCBL c16c16 CLHH d16 LCBL c16 CLHH d32d32d16


FIM e Comentários

Bom, acho que isso é tudo que você vá precisar saber para fazer ports unsampled. Se você seguir os passos cuidadosamente, você não irá se deparar com muitos erros técnicos. Caso esteja com dificuldade para visualizar tudo isso, observe ports de outras pessoas, ou seja, faça engenharia reversa e compare o TXT com o SPC para saber o que está acontecendo ali.

Aos colegas porters: vocês estão convidados a corrigir, complementar, comentar, etc. esse tutorial. A todos os outros: fiquem à vontade para tirar dúvidas, mas já aviso que não ando com muito tempo livre. Então antes de fazer uma pergunta, PESQUISE se alguém já teve o mesmo problema que você e a solução desse tal problema. Digite no Google "smw central *seu problema*" ou algo parecido, que você deve encontrar algo a respeito. A maioria das dúvidas que tive no começo da minha carreira de porter eu resolvi assim.

Vale ressaltar que você só cresce como porter se praticar bastante, sempre tentando se desafiar cada vez mais. Não fique com preguiça ou com medo de tentar coisas novas, e seja persistente ao tentar arrumar os seus erros. Você vai acabar descobrindo coisas muito interessantes assim, facilitando o seu trabalho na próxima vez que portar.

Boa sorte!

Agradecimentos: Harumi, Vitor Vilela.
Seu tutorial é bastante informativo, o layout de texto é simples e enxuto, agradável aos leitores. Como é um texto grande, é recomendável ler com calma e seguir as instruções como ordenado. Belo trabalho Gloomy! #thp{;)}

Estarei stickando o tópico para facilitar o acesso à outros usuários.
minha vista vai doer após ler tudo isso.
Que pena, porque é só o começo. #wario{^_^}
Então é uma benção que não preciso tanto assim de tutoriais mais huh #wario{;)}
Layout by Mathos
Originally posted by Gloomy
Que pena, porque é só o começo. #wario{^_^}

aaaaa
Faz um tutorial no seu canal em video, não consegui de forma nenhuma tinha um programa em 2009 que editava certinho os MML mas foi cancelado... pode por favor fazer um tutorial em video... sou seu novo inscrito e sou ruim em fazer musicas,graficos e etc menos paletas... sou bom em adicionar coisas feitas aqui na smw central em uma rom...
divulgo a smw central, o seu trabalho, e seu canal!!! #smw{:TUP:}
e eu tambem tentei os tutorias escritos e no youtube só que sou médio em ingles e não sei fazer em tutorial escrito e sim conseguiria em um tutorial em video e portugues!!!
Um tutorial em vídeo está muito além do que eu estou disposto a investir nesse assunto: não me sinto confortável em comentar com minha voz. Sou uma pessoa que fala devagar e isso me incomoda. Aliás, eu nem tenho um microfone, lol. Além disso, não tenho habilidade nenhuma em edição de vídeos. E por último, portar música demora. Se o texto aqui está grande é justamente porque tem muita coisa para falar mesmo, e como o nome do tutorial indica, isso que está aqui é apenas o básico.

Contudo, eu tenho planos para fazer algumas mudanças nesse tutorial. Estou pensando em entrar mais a fundo e mastigar mais as coisas para ficar mais simples de entender, e talvez colocar mais exemplos e/ou melhorar os já existentes. Também estou pensando em cobrir ports sampled.

Lamento decepcioná-lo e obrigado pela oferta.
Blz!!! #smw{^_^}
ah sim, esse textão enorme que tenho preguiça de ler é apenas o básico...
eu esqueci...
Originally posted by Manofer
ah sim, esse textão enorme que tenho preguiça de ler é apenas o básico...

smw hacking resumido
(hacking, não level editing no lunar magic)
Originally posted by Chihaya
(hacking, não level editing no lunar magic)

level design?
me ajude, ocorreu os seguintes erros
File: Sbomb4 World 2.txt Line: 4:
Error parsing tempo ("t") command.
File: Sbomb4 World 2.txt Line: 4:
Error parsing tempo ("t") command.
File: Sbomb4 World 2.txt Line: 4:
Error parsing "l" directive.
File: Sbomb4 World 2.txt Line: 4:
Error parsing octave ("o") directive.
File: Sbomb4 World 2.txt Line: 4:
Error parsing replacement directive; could not find '='
tXX especifica o tempo, lXX especifica a duração padrão das notas naquele canal, oX especifica a oitava de notas do canal. Essas letras todas ativam comandos, sendo os X e XX os parâmetros desses comandos. Toda vez que você as usa, o AddmusicK espera algum comando e se ele não reconhecer o comando (que deve seguir estritamente a sintaxe que está no Readme do AddmusicK), ele vai dar erro de parsing.

Se você não conseguir consertar posta o TXT para a gente ver o que pode ser feito.


Originally posted by Lary
file:///C:/Users/helia/Desktop/AddmusicK_1.0.6/music/Sbomb4%20World%202.txt


Não se deve postar o link do caminho do arquivo no seu computador; ou você posta seu port aqui diretamente ou você usa um serviço de armazenamento de arquivo (Dropbox, GitHub, o próprio My Files daqui do SMW Central).

Voltando ao assunto, me parece ser um bom tutorial. Pena que eu ainda não tenha mexido direito com ports para ver se ele ajuda, mas quem sabe um dia...





Dream team (feed them, please):






https://bin.smwcentral.net/u/35061/Sbomb4%2BWorld%2B2.txt
Substitua

Code
     #titulo      "Edo era" 
     #jogo        " bomberman 4" 
     #comentario  " portado pela lary" 

por

Code
#SPC
{
     #title	"Edo era" 
     #game	"bomberman 4" 
     #comment	"portado pela lary" 
}

O comando #SPC é o que faz o AddmusicK ler essas informações da SPC, e esse comando requer que os parâmetros estejam entre chaves { }. O que provavelmente aconteceu foi que, por falta das chaves, o AddmusicK leu as letras dos seus parâmetros como se fossem comandos a parte, como o "t", o "l" e o "o" em "titulo", e como essas letras não estavam formatadas como os comandos que ele estava lendo (tXX, lXX e oX), ele deu erro de parsing. Além disso, eu acho improvável do AddmusicK reconhecer esses parâmetros na língua portuguesa, por exemplo, #titulo ao invés de #title, que é em inglês. Em inglês eu garanto que funciona rs. Leia a seção "Special commands" em "Syntax Reference" do Readme do AddmusicK para saber mais sobre esses comandos de topo, e quando for usá-los tente os seguir à risca conforme é mostrado nos exemplos lá.

Outra coisa, tire os parênteses em (t100). Aliás, t100 é um tempo muito rápido. Se esse tempo está em BPM você terá que fazer uma conversão. O valor para usar no comando de tempo deve ser o valor em BPM multiplicado por 0,4096. Então se a sua MIDI estiver, por exemplo, a 100 BPM, no seu TXT você deverá usar t41.
File: Novo Documento de Texto.txt Line: 1:
Song did not specify target program with #amk, #am4, or #amm.
File: Novo Documento de Texto.txt Line: 1:
Illegal value for tempo ("t") command.
File: Novo Documento de Texto.txt Line: 3:
Illegal value for tempo ("t") command.
File: Novo Documento de Texto.txt Line: 5: ......

deu esses erros agora, se vc me ajudar com isso coloco creditos se quiser, em minha room que estou criando quero muito essa musica :/
Originally posted by Lary
File: Novo Documento de Texto.txt Line: 1:
Song did not specify target program with #amk, #am4, or #amm.
File: Novo Documento de Texto.txt Line: 1:
Illegal value for tempo ("t") command.
File: Novo Documento de Texto.txt Line: 3:
Illegal value for tempo ("t") command.
File: Novo Documento de Texto.txt Line: 5: ......

Não tive nenhum desses erros ao testar a versão mais nova do seu TXT. Os únicos erros que o AddmusicK me deu foram de "Note pitch was too high.". Esses erros indicam que o tom das suas notas está mais alto do que o SPC700 suporta. Isso pode ser consertado abaixando as oitavas (oX) no começo dos canais que estão causando esse erro.

Outra coisa, retire os "(SFX)" dos canais #6 e #7. Toda vez que você usa parênteses você faz o AddmusicK entender que você está chamando um label loop. Se você quiser fazer comentários (texto que não deve ser lido como nota, comando, etc.) você obrigatoriamente deve usar o comando de comentário, que é o ponto e vírgula: ;

Exemplo:

Code
@31 v165 y11 ; Strings 1

Tudo que vem depois do ponto e vírgula na linha em que ele é usado será considerado como comentário. No caso desse exemplo, "Strings 1" é o nosso comentário e será tratado apenas como texto pelo programa. Tendo isso em mente, se você quiser indicar que os canais #6 e #7 são usados para SFX você pode fazer o seguinte:

Code
#6 ;;; (SFX)
r1...

Code
#7 ;;; (SFX)
r2.r192o3a24^a64a32r12r32>>d+32r96

Vale a pena mencionar que a quantidade de ponto e vírgulas seguidos que você usar é irrelevante, e você pode usá-los em linhas vazias também!
Ok vou fazer essas alteraçoes, mais percebi um bug no addmusick qualquer musica que eu vou colocar da o mesmo erro que te mandei nessa ultima mensagem (ate as que baixei desse site) sabe como arrumar isso ?
  • Pages:
  • 1
  • 2