O mundo interior dos Formants P432



A história de como eu comprei inesperadamente um sintetizador, o consertei, descobri como ele funciona e escrevi um emulador.

Esta história começou durante o festival Chaos Constructions no último fim de semana de agosto de 2019. Olhando pelo Avito à noite em busca de artefatos interessantes de uma época passada, me deparei com um sintetizador barato do Formant P432. Parecia bastante familiar para sintetizadores digitais: na parte inferior há um teclado de 41 teclas (3,5 oitavas), na parte superior existem botões para selecionar um som, ativar os efeitos de coro e uníssono, além de botões para ajustar o efeito vibrato. Um joystick é instalado à esquerda do teclado, permitindo que você mude a afinação para cima e para baixo, além de conectar suavemente o vibrato.

O mais interessante para mim foi que esse sintetizador era digital e gerava sons usando o método wavetable, ou seja, no momento de pressionar a tecla, gerava som com base em dados tabulares armazenados em chips ROM. Após um rápido conhecimento dos circuitos na Internet, ficou claro que o controle do sintetizador é baseado no conhecido microprocessador KP580VM80 (i8080), e os sons são armazenados em 8 chips de ROM com um volume total de 8 * 2 = 16 Kb.

O sintetizador foi comprado e partiu lentamente da cidade do vendedor para o escritório local da empresa de transporte, e continuei a estudar os esquemas. O vendedor escreveu em um anúncio que a ferramenta possui um defeito que se manifesta na forma de chiado quando você pressiona mais de uma tecla. Ainda mais interessante, pensei. "Será necessário encontrar e eliminar."

Mas o principal motivo para a compra foi o desejo de lidar com o dispositivo interno e extrair amostras de sons da ROM do sintetizador.

AVISO LEGAL : Os nomes dos componentes dos nós e sinais do sintetizador (que não sejam os indicados entre "aspas" e letras BIG) foram inventados por mim e podem diferir do que os desenvolvedores pretendiam. A descrição da operação dos nós é baseada no meu conhecimento (limitado), nos materiais da Internet e nos conselhos de pessoas experientes.

Reparação


Quando o P432 [ 2 ] chegou a mim são e salvo, a primeira coisa que fiz foi desmontá-lo. No interior, eu não esperava uma visão muito agradável de feixes de fios e várias placas de circuito impresso.

Nó de controle
A placa na qual os botões e controles no painel frontal são soldados, bem como uma indicação dos modos de operação.

Nó do processador
Ele contém o microprocessador KR580VM80 e outros chips do kit 580, uma ROM de 2 KB no RF2, dois chips de RAM estáticos com capacidade total de 256 bytes (K541RU2). Além disso, os decodificadores são instalados na placa, que alocam partes do espaço de endereço para interação com o teclado, com botões e registros de controle, na saída em que os sinais de controle são gerados para o nó do gerador.

Nó da interface MIDI
Ele é instalado acima do nó do processador e consiste em uma ROM separada com rotinas de mensagens MIDI, lógica fina e dois microcircuitos grandes: o controlador de interrupção VN59 e a interface BB51 em série. Para os contatos TX / RX VN51, um circuito de implementação de loop de corrente midi padrão com isolamento do acoplador óptico é conectado.

Nó de coro
Sob a forma de uma placa isolada com apenas entrada, saída e energia analógicas. É implementado em microcircuitos KA528BR2 - linhas de atraso analógicas. A unidade é muito barulhenta, mas dá ao som uma cor interessante.

Montagem do gerador
O módulo principal do sintetizador. Ele contém 8 chips de ROM de 2 KB cada, lógica digital (registradores, somadores), dois DACs, um filtro analógico com parâmetros variáveis ​​e estabilização térmica. O nó também contém um gerador de relógio com o qual a operação dos registradores do nó do processador é sincronizada. A placa filha neste nó possui uma placa VCO (gerador controlado por tensão), que é um refinamento de fábrica das revisões posteriores do sintetizador.

Montagem de retificador e estabilizador
Uma fonte de alimentação linear que produz + 5V para potência lógica e + 12 / -15V para amplificadores operacionais. + 5V é estabilizado pelo KR142EN5, cujo radiador é a caixa de metal do sintetizador e + 12 / -15V é o estabilizador paramétrico mais simples nos diodos e transistores zener. Uma tensão de alimentação adicional de -5V para o KR580VM50 é formada por um diodo zener de -15V diretamente na placa da unidade processadora. Os terra analógico e digital são separados separadamente e são conectados apenas neste bloco.

Teclado de instrumento
Chave Reed, não sensível à velocidade, como em outros sintetizadores da fábrica de rádio Kachkanar da Formant.



A remoção do nó MIDI em uma placa separada com sua ROM deve-se à presença de outro sintetizador na linha P432 - o “Formant MINI”, que não possui interface MIDI e o efeito HOR. O nó do processador MINI é um pouco diferente no firmware e o nó do gerador é o mesmo que no P432.

Então, quando liguei pela primeira vez, notei dois problemas: um nível de sinal muito fraco na saída linear e o som já mencionado ao pressionar mais de uma tecla de cada vez. Note-se que o P432 é um sintetizador polifônico e pode tocar simultaneamente 4 vozes (frequências) de um timbre. E com a inclusão do efeito UNISON, o número de vozes simultâneas aumenta para 8, duas para cada tecla.

O motivo do som silencioso foi encontrado quase imediatamente; a saída queimada OU K544UD1A foi a culpada.

Depois de substituí-lo, o instrumento começou a soar alto, mesmo quando fones de ouvido passivos foram conectados à saída.

Mas com sons estranhos, a situação era muito incompreensível, porque mesmo quando as teclas individuais eram pressionadas, os sons dos tons não eram como a demonstração P432 do youtube.

Demorou um pouco para encontrar o problema, mas no final ele foi localizado no nível do DAC principal. O bit alto da entrada digital não foi suficiente para reconhecê-lo como lógico 1; portanto, o sinal de saída analógica foi distorcido. O culpado dessa história foi encontrado e eliminado, após o qual o problema foi resolvido. Todos os tons começaram a soar claros e sem problemas com alguns toques.

Teria um fim na história, mas já havia muito tempo gasto no reparo, então decidi que não deveríamos parar por aí e precisamos descobrir:

  • como é o processo de síntese sonora
  • o que é armazenado na ROM da unidade geradora
  • como o filtro funciona e suas características
  • onde a configuração para cada parâmetro de tom e envelope é armazenada

O resultado deste trabalho foi a emulação de software do P432 usando dados da ROM original.

Montagem do gerador


A forma de onda na saída do DAC principal da unidade geradora é formada pelo princípio da síntese digital direta (DDS) [ 1 ]. O sinal analógico recebido é passado por um filtro passa-baixo e, se necessário, é misturado à saída do coro, amplificado por um amplificador de saída e alimentado a uma saída linear. O filtro em P432 é feito de acordo com o esquema usado anteriormente no sintetizador Polyvox [ 3 ].


O diagrama mostra a unidade geradora e seus principais blocos funcionais. As setas laranja indicam entradas e saídas de sinais digitais externos, sinais preto-digitais dentro do módulo, sinais azuis-analógicos.


Primeiro, considere as entradas e saídas:

  • Entrada “Frequency” (11 bits) - para cada voz, incluindo uníssono, os valores correspondentes à tecla pressionada ou à nota MIDI vêm do nó do processador.
  • Entrada do amplificador (8 bits) - o valor do envelope para a amplitude do sinal.
  • Entrada “Filtro” (8 bits) - valores do envelope da frequência de corte do filtro.
  • Entrada “Control” - (8 bits) - 3 bits menos significativos são responsáveis ​​pela seleção da forma de onda, 2 bits pelo deslocamento do filtro, mais 2 pelo nível de qualidade Q do filtro Q (ressonância) e o último bit determina se o efeito UNISON está ativado ou não.
  • “Endereço” de saída (3 bits) - responsável pela sincronização com o nó do processador.

Agora vamos ver como os principais blocos do nó funcionam.

O circuito de sincronização, com a ajuda de multivibradores, um contador e elementos lógicos, gera pulsos de controle para vários módulos da unidade geradora e fornece o número de voz atual à saída "Address". Quando o modo "Endereço" UNISON está ativo, recebe os valores [0,1,2,3,4,5,6,7] e quando inativo: [0,2,4,6]. A frequência do oscilador principal pode ser alterada em pequena medida com o botão de ajuste no painel frontal e o joystick à esquerda do teclado.

Diagrama de tempo de pulsos de relógio. Explicações: Unison - log. 0 nível ativo, FA0-2 - Saída "Endereço", DD8-12 - registro do acumulador de fase, DD33-35 - registro total de votos, DD36-37 - registro DAC.


A parte digital da placa do gerador para cada um dos 4 (8) votos simultaneamente com uma alteração no valor do "Endereço" de saída executa as seguintes operações. No nó do processador, a entrada "Frequency" recebe os valores de frequência do sinal. O valor linear da frequência é convertido em incremento de fase pelo decodificador na ROM. Os incrementos são somados no acumulador de fase (20 bits), consistindo em um somador e RAM de 8 palavras. Os 9 bits mais altos da soma são alimentados nas entradas de endereço da ROM da forma de onda. Uma área específica da ROM é selecionada pelos três bits menos significativos da entrada "Controle". 10 bits da saída da ROM são somados com o valor na entrada do “Amplificador” e alimentados às entradas da ROM de escala, o que gera um código bipolar para o DAC. A saída cai no buffer de acumulação, construído em somadores e registradores, que soma sequencialmente os valores de código de todos os 4 (8) votos. No final de cada ciclo, o código final é bloqueado pelo registro de armazenamento e chega ao DAC de 12 bits. A frequência de emissão do código no DAC é a frequência de amostragem do sinal e, para P432, é de cerca de 33 kilohertz. Segundo Nyquist, a frequência sonora máxima disponível para o gerador P432 é de aproximadamente 16,5 kHz.

Se o timbre selecionado exigir uma alteração dinâmica dos parâmetros do filtro passa-baixo, os valores do envelope serão enviados para a entrada Filtro, que, passando pelo DAC de 10 bits, forma a tensão de controle do filtro do amplificador operacional. O filtro passa-baixo é feito de acordo com o filtro sem condensador do filtro de estado variável e inclui um circuito de estabilização de temperatura, um bloco para alterar o fator Q de Q e a polarização inicial.


Este gráfico de tempo mostra dois períodos de discretização da placa do gerador. UNISON está desligado. A entrada de frequência (Freq_in) de forma síncrona com a alteração de endereço recebe os números de frequência de quatro teclas diferentes. Mas apenas os dois últimos são pressionados (Volume_in = 0xFF). Ao mesmo tempo, um valor constante (Filter_in = 0x60) é emitido para a entrada "Filter". O código final é inserido no DAC (DAC) após o encaixe nos registros de armazenamento (DD36-37).

Para UNISON incluído
tudo parece igual, apenas a entrada "Frequency" recebe um par de números: para a voz principal e o uníssono.

Nota: apenas um período é exibido.



Uma descrição mais detalhada do conjunto gerador


Abaixo estão os detalhes e diagramas esquemáticos elétricos para quem deseja entender o dispositivo sintetizador com mais detalhes. Os circuitos foram encontrados na Internet, embora um manual de operação [ 4 ] e um conjunto completo de circuitos de papel [ 5 ] tenham sido anexados ao meu sintetizador. Boas pessoas compartilharam o arquivo com o conteúdo de todas as ROMs em um fórum, mas, como se viu, houve um erro em um dos arquivos, então tive que cancelar a inscrição de ROMs individuais e compará-las com o firmware do arquivo.

Note-se que durante a produção do P432, o fabricante emitiu várias revisões das placas sintetizadoras, a fim de melhorar as características técnicas, que podem diferir dos primeiros esquemas de revisão apresentados abaixo.



  1. A ROM de conversão de incremento de frequência - DD1-2, executada em dois 573RF2, contém uma tabela de correspondência do valor da frequência linear para o incremento de fase exponencial. Graficamente, seu conteúdo fica assim



    Síncrona com uma alteração no valor na saída "Endereço", o nó do processador emite um valor de frequência de 11 bits da voz correspondente para a entrada "Frequência", que é convertida em incrementos de 16 bits.

    Se considerarmos o conteúdo das 16 primeiras palavras de DD1-2, alguns números estranhos são escritos lá que parecem não ser usados ​​na síntese do som:

  2. Acumulador de fases - consiste em somadores DD3-7 (561IM1) e registros DD8-12 (561IR11). Adicionadores são incluídos na cadeia com uma capacidade total de 20 bits. O bloco de registro permite armazenar oito valores da fase do sinal de 20 bytes. As entradas de endereço dos registros de leitura / gravação são conectadas ao barramento "Endereço". Essa inclusão permite receber o valor anterior na saída do pulso do relógio e salvar o valor atual da entrada. Isso garante o acúmulo de fase separadamente para cada sintetizador de voz. Os 9 bits altos da saída do registro são alimentados nas entradas de endereço da ROM da forma de onda.
  3. Forma de onda ROM - DD13-14, DD18-19 (5732) contém tabelas de oito formas de onda que podem ser sintetizadas por um conjunto gerador. Uma área de memória específica e um par de ROMs são selecionados pelos bits S0-S2 do sinal "Control". Sob a descrição de cada sinal, 512 palavras são atribuídas com uma capacidade de 11 bits. Os 10 bits mais significativos têm uma finalidade de utilidade, indicando a polaridade do sinal: 1 positivo, 0 negativo. A aparência das formas de onda é dada levando em consideração a reversão de valores negativos:

    Wave_00
    Wave_01
    Wave_02
    Wave_03
    Wave_04
    Wave_05
    Wave_06
    Wave_07
  4. Adicionador de Envelope - Envelope de 8 A (deslocado para a esquerda em 2 bits), somados nos elementos DD23-25 ​​(561IM1) com os 10 bits de saída menos significativos da ROM da forma de onda, é inserido na entrada do Amplificador. O envelope possui 4 fases: Ataque, Decaimento, Sustentação, Liberação, formadas pela unidade processadora separadamente para cada uma das 4 vozes principais, dependendo do momento em que a tecla é pressionada / liberada.
    Um exemplo de envelope para o tom 00: um ataque rápido a 255 é claramente visível, um declínio no nível 239 e uma diminuição suave no nível, terminando com uma atenuação acentuada em 0 ao soltar a tecla. No eixo horizontal é o tempo em segundos, no eixo vertical é o valor da entrada "Amplificador".

    Envelope da entrada \ "Amplificador \"


    Os valores na ROM do sintetizador são selecionados de forma que, em 0 na entrada do "Amplificador", a saída do DAC também tenha um nível de sinal zero, apesar do fato de que todos os circuitos intermediários alteram constantemente os valores das variáveis ​​e geram sinais diferentes.
  5. A ROM de escala, consistindo em DD27-28 (5732), contém curvas para obter o código do sinal bipolar de acordo com o valor do bit de ordem superior da forma de onda. Em forma gráfica, o conteúdo da ROM se parece com isso.



    Se o décimo bit for 1, o valor da saída DD28 + 256 será usado e, se 0, DD27 + 1.
  6. O acumulador de votos no DD30-32 (561IM1) e registra o DD33-DD35 (5619) combina os valores dos códigos de todos os votos antes da emissão para o DAC. Após o processamento do código da última voz, o valor recebido é transferido para o registro de armazenamento e o registro do somador é redefinido para zero.

    Exemplo: Como mencionado acima, se "Amplificador" = 0 e o valor máximo possível de amplitude na saída da ROM da forma de onda (1 << 10) -1 = 1023, na saída da ROM de escala obtemos 0 + 256 ou 255+ 1, dependendo de 10 bits da forma de onda, que fornece um total de 256 * 8 = 2048 e corresponde a 0 na saída do DAC.
  7. O registro de armazenamento nos elementos DD36-37 (555TM9) recebe e armazena o valor do código na saída durante o intervalo de amostragem. A frequência de amostragem do nó do gerador é aproximadamente igual a 33000 Hz.
  8. DA38 DAC (534PA1) - converte um valor de 12 bits em um sinal bipolar analógico, o código 2048 corresponde ao analógico 0.
  9. Filtro passa-baixo - construído de acordo com o esquema desenvolvido por Vladimir Kuzmin para o sintetizador Polivox, no entanto, um nó para estabilização térmica da corrente de controle do filtro OA foi adicionado ao P432. Além disso, é retirado do mesmo Polivox, onde foi usado para estabilizar a frequência dos geradores. No site do autor, você pode encontrar instruções sobre como configurar este nó [ 6 ].

    Muito já foi escrito sobre o próprio filtro, para que possamos fazer sem detalhes.
    O controle de filtro é construído em um DAC de 10 bits (572PA1), cuja entrada é alimentada com um sinal de "Filtro" de 8 bits, que é o envelope do filtro e, dependendo do timbre, pode ser um valor constante e geralmente igual a zero. Os parâmetros do filtro também são afetados pelo valor de 4 bits do sinal “Control”: F0-F1 define o deslocamento da tensão de saída do DAC, e Q0-Q1 são responsáveis ​​pelo fator de qualidade (nível de ressonância) do filtro.
  10. Após o filtro, é instalado um comutador que permite ativar a mixagem com o sinal principal de sua cópia processado pelo efeito HOP. Nas primeiras modificações do P432, o mesmo interruptor foi usado para desligar a saída de som quando nenhuma tecla foi pressionada. Porém, em revisões posteriores, isso foi recusado, eles começaram a abrir caminhos, lançar fios e adicionar novos elementos ao circuito.
  11. Amplificador - aumenta o nível do sinal de saída para 250mV.

Configuração e nó da CPU


Então, descobrimos os geradores. Agora resta entender de onde vêm todos os sinais de controle e onde os parâmetros que os descrevem são armazenados.

Inicialmente, planejei remover dumps de todos os sinais de controle por um analisador lógico e criar um algoritmo para descrevê-los. Por exemplo, os envelopes do amplificador e do filtro podem ser descritos por uma função linear por partes, que requer um número limitado de parâmetros.

Com a entrada “Frequency”, também foi suficiente registrar os valores de frequência de uma única tecla para cada timbre e calcular todos os outros com base nela.

De acordo com o manual de instruções, o P432 possui um teclado de 41 teclas com um volume de 3 e 5/12 oitavas com um intervalo de C1-E4 na notação científica ou C1-e1 na notação Helmholtz. No entanto, na prática (para o tom 00), com base na correspondência A4 = 440 Hz, verificou-se que a tecla A na segunda oitava esquerda produz um som dessa frequência, e isso já fornece a faixa C3-E6. Como se viu mais tarde, dependendo do tom ativo, o alcance das frequências reproduzidas pode variar, mudando em 1 ou 2 oitavas.

Também gravei os valores de bytes da entrada "Control" do analisador lógico para todos os tons possíveis e os trouxe para uma placa.

Lista de vozes e valores de entrada de controle

Era óbvio que todos esses parâmetros de configuração deveriam ser armazenados em uma das ROMs do sintetizador e, após uma pequena pesquisa, eles foram encontrados na segunda metade do firmware DD16 no nó do processador. Deixe-me lembrá-lo de que o volume da ROM 573RF2 é de 2048 bytes.



1024 bytes da área de configuração foram facilmente divididos em 32 tons, alocando 32 bytes para as configurações de cada timbre. Passei bastante tempo procurando uma correlação entre as configurações de tom e as fases reais do envelope, a frequência do som e muito mais. Eu tive que olhar para muitos lixões do analisador lógico.

O resultado é essa tabela.
, 00/FF, .
Descrição do produto
0 0FA_min
1FA_dt
2FA_max
3??
4FD_ft
5FD_dt
6FS_lvl
7FREQ_u1
8FS_ft
9FS_dt
10FR_ft
11FR_dt
12??
1300
14FREQ_u2
15Ctrl«»
16A_min
17A_dt
18A_max
19FF
20D_ft
21D_dt
22S_lvl
23FF
24S_ft
2500
2600
27R_dt
28.??
2900
30FREQ_1
31FREQ_2

Como pode ser visto na tabela, todos os valores podem ser divididos em quatro grupos: a descrição do envelope da entrada “Amplifier”, o envelope da entrada “Filter”, o byte da entrada “Control” e os bytes responsáveis ​​pelas frequências da voz principal e UNISON na entrada “Frequency”.

Vamos considerá-los com mais detalhes usando o exemplo do envelope do amplificador, com o qual eu lidei pela primeira vez. O envelope Filtro é formado de maneira semelhante, com exceção de alguns tons para os quais foi necessário usar um código rígido, porque não foi possível obter o envelope correto de maneira diferente.

Os parâmetros com o sufixo * _dt especificam o delta da alteração do nível do sinal da fase correspondente, por exemplo, para o tom 00: A_min = 0, A_dt = 48 e A_max = 255. Isso significa que o valor inicial do Ataque 0 deve ser incrementado em 48 até chegar a 255. Para a fase Fall, o valor de D_dt deve ser diminuído de A_max para o nível S_lvl, se S_ft> 0, o nível de Suporte deve diminuir a cada intervalo de S_ft em 1, simulando som suavemente desbotado. O parâmetro R_dt indica o delta da fase de atenuação: o nível atual do envelope deve ser reduzido em R_dt a cada intervalo de tempo até atingir o nível 0. O dt real é 1 se o valor do parâmetro * _dt <= 1 e o valor * _dt em outros casos.

Os parâmetros * _ft determinam o tempo durante o qual o valor deve permanecer inalterado, um tipo de intervalo de amostragem para envelopes. Empiricamente, verificou-se que o valor zero deste parâmetro corresponde a ~ 100 períodos de amostragem DAC ou ~ 3 ms. Para valores maiores que zero, o tempo deve ser calculado usando a fórmula int (256 / * _ft) * 100 , ou seja, * _ft é um multiplicador para o intervalo base de 100 períodos DAC.

Ilustração mostrando todas as opções de envelope. No lado direito, ele é duplicado com discretização explícita para uma melhor compreensão da essência dos parâmetros * _ft / * _ dt.



O byte "Management" na área de configuração coincidiu com o que recebi empiricamente usando um analisador lógico.

Os bytes de frequência determinam o valor da entrada Frequency. Como já mencionado acima, o sintetizador pode tocar simultaneamente 4 vozes (polifonia), cada uma das quais, quando o UNISON está ligado, pode ser adicionado em uníssono outro gerador com um ligeiro desafinação ou deslocamento do principal por 1-2 oitavas.

As frequências são codificadas em dois bytes: FREQ_1, FREQ_2 para o principal e FREQ_u1, FREQ_u2 para uníssono. Uma fórmula derivada experimentalmente para calcular o valor da frequência da nota A da segunda oitava do teclado P432.

freq_offset = {4:0xd0, 5:0x90, 6:0x50} freq = (config['FREQ_1'] << 8) + freq_offset[config['FREQ_1']] + config['FREQ_2'] 

Um exemplo para o tom 00, em que: FREQ_1 = 6, FREQ_2 = 8, obtemos: 6 * 0x100 + 0x50 + 8 = 0x658, o que é consistente com os dados do analisador lógico para todos os tons. Por uníssono, o cálculo é semelhante.

Vale ressaltar que, para o tom 00, o valor 0x658 corresponde a uma frequência de 440 Hz ou nota A4.
Foi experimentalmente estabelecido que o intervalo de "Frequência" para teclas adjacentes (incluindo preto) é de 16 (0x10) unidades. Portanto, se soubermos o valor da 22ª chave à esquerda (A da segunda oitava) - 0x658, podemos obter facilmente o valor para a extremidade esquerda (nº 1): 0x508 e a extremidade direita (nº 41): 0x788.

Com base nisso, você pode calcular o alcance do teclado e as frequências reproduzidas para diferentes tons. A coluna "Frequência" estará correta apenas para formas de onda simples.
FREQ_1RangeFrequência HzTimbres
4C1 - E432,70 - 329,6301, 07, 13, 14, 25, 30, 31, 32, 33, 34, 35
5C2 - E565.41 - 659.2603, 05, 06, 10, 15, 17, 23, 24, 27, 37
6C3 - E6130.81 - 1318.5100, 02, 04, 11, 12, 16, 20, 21, 22, 26, 36
O acima é mais do que suficiente para criar o emulador P432, então vamos para ele.

Criando emulação P432 em Python


Eu pensei que seria bom separar o armazenamento de configuração e a geração de som, então duas classes principais foram criadas:

  • P432data, responsável por carregar valores das imagens da ROM e trazer a configuração dos tons para uma forma conveniente de uso;
  • P432, contendo métodos para criar formas de envelope e realmente gerar amostras digitais.
Não vou me debruçar sobre o P432data em detalhes, o código-fonte pode ser visualizado no github.
Mas os métodos do P432 são considerados em mais detalhes.

O principal, é claro, é gen_samples com um parâmetro indicando o número de amostras que ele deve retornar. Nesse método, o processamento de sinais desde o recebimento do valor na entrada “Frequency” até a saída para o DAC é recriado o mais próximo possível do protótipo. Em princípio, focando no esquema P432, você pode encontrar rapidamente os equivalentes em Python dos módulos do conjunto gerador. A única coisa que precisou ser explicitamente adicionada foi a redução das variáveis ​​para a dimensão especificada: 20 bits para o acumulador de fase, 11 bits para o somador de envelopes e 12 bits para o somador de votos. Essa restrição é necessária para que a lógica de estouro dessas variáveis ​​funcione normalmente.

Os métodos para criar envelopes do amplificador getADS e o formulário do filtro getFADS são listados com os valores da amplitude do envelope, a partir dos quais gen_samples recebe valores no momento em que pressiona as teclas. Eles possuem alguns métodos getR e getFR em sua empresa que formam a fase de atenuação de envelopes. Eles tomam o parâmetro level como uma entrada - o valor atual do nível do envelope, a partir do qual ele diminuirá para 0.

As quatro vozes principais têm o mesmo formato de envelope do amplificador e do filtro, mas se o amplificador tiver seu próprio envelope para cada voz e iniciar quando uma tecla for pressionada, o filtro é comum a todas as vozes, começa na primeira pressão, reinicia na próxima pressão e dura até a última deixando ir. Olhe acima

De acordo com o manual de instruções, o P432 emite números de notas MIDI de 36 a 77 (na realidade 76) para as teclas de teclado 1 a 41, respectivamente. Para não reinventar a roda, decidi usar o intervalo 36-76 no emulador como os números da tecla pressionada, então precisava do método midi2freq, que converte o número da chave no valor "Frequency", levando em consideração o tom selecionado.

O último par de métodos foi key_press (midi_note) e key_release (midi_note), que formaram um dicionário de correspondência da voz com a frequência do tom fundamental, fase e posição atual do envelope.

O último método principal é o setprog (prog, clean = True), projetado para selecionar o som ativo. Setprog carrega a configuração do som desejado e, se o sinalizador limpo não for limpo, limpa as variáveis ​​internas. Se clean estiver definido como False, as variáveis ​​internas não serão redefinidas, o que permite alternar entre tons durante a geração do som praticamente sem cliques ou outros sons desagradáveis.

Para gravar as amostras geradas no arquivo WAV, o método do utilitário write_wav foi criado com base no módulo wave. Para cada amostra, o dimensionamento é realizado para aumentar a amplitude e trazê-la para um formulário assinado de 16 bits.

Esses métodos são suficientes para obter um arquivo wav com a gravação de alguns segundos de qualquer um dos sons do sintetizador.

 #    p432=P432() #   p432.setprog(0) #     (  ) p432.unison=False p432.filter_en = False #   A   p432.key_press(57) #  3   samples=p432.gen_samples(33000*3) #   p432.key_release(57) #    p432.write_wav('test_00.wav',samples) 

A forma de onda do timbre 00 é um sinusóide; portanto, na saída, obtemos um sinusóide com um envelope sobreposto. Para ouvir.



Um pouco mais interessante será a gravação do tom 14 com o uníssono e o filtro ativados. Para ouvir.



GUI


Um gerador de som do console é bom, mas também quero tocar no teclado. Então, decidi criar uma GUI simples no Tkinter.

A interface foi influenciada pelo P432 real, com a adição de uma legenda do teclado, um botão de seleção de entrada MIDI e a capacidade de desligar o filtro.


O botão “Midi In” aparecerá se você tiver o módulo “python-rtmidi” instalado. Depois que você pressiona e seleciona o dispositivo de entrada Midi, o programa ativa uma função de retorno de chamada que captura os eventos Note-On, Note-Off e Program Change em todos os 16 canais midi. Através da mudança de programa, você pode alterar o número do tom do emulador ativo.

Para interceptar as teclas digitadas no teclado, use o método Tkinter bind ('<KeyPress') , bind ('<KeyRelease') e, na função de retorno de chamada, o número da chave é verificado com a lista permitida, convertido em uma nota midi e os métodos p432.key_press () são chamados , p432.key_release () . A interceptação é ativada quando o programa é iniciado e desativado no final.

Para emitir som de streaming, o módulo pyaudio é usado no modo sem bloqueio. Após renderizar a interface, ela inicia em um encadeamento de segmentação separado, e o tkinter continua trabalhando principalmente. Na função de retorno de chamada, o pyaudio passa o número de amostras a serem geradas e, em troca, recebe amostras de gen_samples e um sinalizador de status. Para reduzir a latência entre o evento de anotação (pressionando uma tecla) e a aparência do som, um buffer bastante pequeno é selecionado: 200 amostras. É definido pelo parâmetro frames_per_buffer do método open pyaudio.

A versão pyinstall compilada do P432_emulator for Windows pode ser baixada de releases .

Conclusão


Neste artigo, os detalhes da operação do filtro analógico no nó do gerador (e sua implementação digital no emulador), o nó do processador, o efeito HOP e a interface MIDI quase não são divulgados. A ênfase foi colocada no design da parte digital da unidade geradora, o método de armazenar os parâmetros dos timbres e usá-los na criação do emulador.

Se o tópico for de interesse, planejarei um segundo artigo com uma análise do restante.

Além disso, se lhe parecer que há erros ou imprecisões na descrição da operação dos nós P432, escreva nos comentários.

O código fonte do projeto, o firmware da ROM, os diagramas e o manual de operação estão disponíveis no github .

Referências


  1. Ridiko L. DDS: Síntese direta de frequência digital.
  2. Museu de sintetizadores soviéticos, Formant P432. www.ruskeys.net/base/form432.php
  3. Wikipedia Polyvox.
  4. Instrumento de teclado eletromusical “Formant P432”. Manual de operação .
  5. Diagramas esquemáticos elétricos do “Formant P432”.
  6. Definir a estabilidade da temperatura do Polyvox.

Source: https://habr.com/ru/post/pt482292/


All Articles