Domanda:
Come generare il tono di una forma d'onda specifica?
Mentalist
2018-09-11 20:53:18 UTC
view on stackexchange narkive permalink

La maggior parte dei sintetizzatori può generare i tipi standard comuni di forme d'onda, come seno, triangolo, quadrato, dente di sega, impulso, rumore, ecc. E questi possono essere utilizzati per creare vari tipi di timbro in un tono sintetizzato.

Oggi mi sono trovato a chiedermi come generare forme d'onda personalizzate specifiche, come quella illustrata di seguito:

È facile vedere che questo è un accoppiamento di un onda quadra e un'onda triangolare con differenze specifiche di ampiezza. Ovviamente questo risulterebbe in un tono che suona diverso da una semplice onda quadra, o solo un'onda triangolare, o da qualsiasi fusione dei due. Questa è una forma d'onda unica con il suo timbro unico.

Per un tipo così fondamentale di editing audio, sono rimasto sorpreso dal fatto che non riuscissi a pensare a un modo per creare toni personalizzati come questo.

Le ricerche sul web mi hanno portato a diverse soluzioni che all'inizio sembravano promettenti, ma che alla fine non hanno consentito proprio questo livello di personalizzazione.

Quali sono alcuni metodi per generare un tono audio da una specifica forma d'onda rappresentata graficamente?

Grazie in anticipo per qualsiasi aiuto.

Potresti, sai, usare Python o Matlab per generare la sequenza numerica. Non è davvero così difficile imparare quelli. (o Octave, il semi-sostituto gratuito per Matlab)
@CarlWitthoft Quali risorse potresti consigliare per indirizzare un noob Python nella giusta direzione per farlo? Non ho mai usato Python per eseguire il rendering dell'audio, sebbene ne fossi curioso.
Ciao Mentalist. Sfortunatamente i consigli sul software sono fuori tema su questo SE. Puoi provare il software recs SE se puoi adattare la tua domanda alle sue linee guida
@Dom Ok, scusa. In realtà ero indeciso su quale SE pubblicare. Speravo che la competenza audio di questo SE si sarebbe dimostrata più fruttuosa delle raccomandazioni generali SE. Dato che è fuori tema dovrei eliminare questa domanda?
@Dom Ho riformulato la domanda in modo che forse si possa rispondere alla domanda senza fare affidamento su consigli specifici del software.
L'ho riaperto ora poiché si adatta molto meglio al nostro scopo ora
Come imparare Python? La mia raccomandazione sarebbe quella di Google "Python Tutorial" e preparati a essere sepolto sotto una valanga di tutorial online gratuiti
@CarlWitthoft Intendevo gestire specificamente l'audio con Python. Ho studiato le basi di Python, ma non l'ho mai usato per creare o modificare dati audio. Lo cercherò su Google ovviamente, ma ero solo curioso di sapere se avessi consigli su un punto di partenza.
Quattro risposte:
leftaroundabout
2018-09-12 04:42:24 UTC
view on stackexchange narkive permalink

L'opzione zero abilità consiste nel disegnare a mano libera la forma d'onda in uno stupido editor GUI, anche Audacity lo farà

drawing waveform in Audacity

quindi copia&pasta un paio di volte

DRY

e riproducilo in un ciclo.

Questo non è proprio pratico però: il disegno della forma d'onda è complicato e anche se si suppone che la forma d'onda sia liscia, inevitabilmente lascerai dei bordi irregolari che saranno effettivamente molto evidenti nel suono (bordi taglienti = transitori = toni alti trasandati). Praticamente tutto ciò che puoi produrre in questo modo suonerà come un brutto e noioso seghetto alternativo allo stesso tempo.

Un semplice script in un linguaggio di programmazione è molto più conveniente e abbastanza facile da fare, ma francamente non è neanche così utile . L'orecchio non sente le forme d'onda , piuttosto sente gli spettri di frequenza. La banda standard di seno, triangolo, dente di sega e quadrato non è solo facile da generare con l'elettronica analogica, è anche praticamente tutto ciò di cui avrai bisogno come punto di partenza per qualsiasi segnale di forma d'onda veramente periodica. La messa a punto di come dovrebbe suonare viene eseguita in modo più efficace con il filtraggio sottrattivo, piuttosto che con la manipolazione della forma d'onda. puoi anche creare una risposta in frequenza in una forma d'onda wavetable, ma questo in linea di principio non realizza nulla che un filtro a dente di sega + FIR non possa realizzare.

Per andare oltre al suono standard dell ' oscillatore analogico , ciò di cui hai bisogno non è tanto un aggiustamento della forma d'onda più fine quanto un aggiustamento della dipendenza dal tempo . I segnali di strumenti reali e la maggior parte dei sintetizzatori decenti hanno non forme d'onda veramente periodiche, ma suoni di attacco distintivi e / o effetti di modulazione in corso. Può avere senso modulare la forma d'onda stessa, questo è ciò che realizzano la modulazione di fase / FM e fondamentalmente anche i circuiti modulatori ad anello. Parametrizzare esplicitamente la forma d'onda in qualche altro modo sarebbe più complicato e probabilmente non sarebbe neanche molto più interessante.

Kevin Reid
2018-09-11 23:10:59 UTC
view on stackexchange narkive permalink

Non ho nessuna particolare esperienza musicale con questo, ma alcuni termini e idee che potrebbero essere utili:

  • Sul banco di prova dell'elettronica, quello che stai cercando è noto come generazione di forme d'onda arbitrarie ed è una caratteristica dei generatori di segnali. Non ha assolutamente senso acquistarne uno se hai intenzione di convertire subito il suo output in audio digitale, ma forse conoscere il nome è utile.

  • Se tu sei pronto per un po 'di programmazione, potresti generare un file contenente solo la sequenza di numeri binari che rappresentano la forma d'onda, fino a quante ripetizioni sono utili, e quindi utilizzare un editor audio (come Audacity (che non pretendo sia una buona scelta, solo che so che può farlo ed è gratuito)) per convertirlo in un formato audio più tipico, se il tuo linguaggio di programmazione preferito non ha comunque una comoda libreria per scrivere file audio. Quasi tutti i linguaggi sarebbero in grado di mettere i dati binari in un file, anche se alcuni lo rendono più facile di altri.

    Ho anche imparato che Pure Data, un ambiente di programmazione visuale per la musica, tra le altre cose, consente facilmente di farlo; puoi letteralmente disegnare una forma d'onda con il mouse (o caricarla da un file) mentre è in riproduzione. (Non ce l'ho davanti, quindi non posso fornire un esempio; vedrò se riesco ad arrivarci più tardi.)

  • La tecnica di l'uso di forme d'onda arbitrarie e il passaggio da una all'altra per cambiare il timbro è chiamato sintesi wavetable . Potresti dare un'occhiata a un software destinato a farlo che consente anche di caricare / creare nuove forme d'onda: non so se sia una cosa poiché ho appreso solo di recente il concetto, ma mi è sembrato abbastanza pertinente da menzionare.

  • Potresti metterlo insieme da zero usando semplici operazioni di editing audio (sento che Audacity dovrebbe essere in grado di fare tutto questo ma non ce l'ho davanti per controllare): genera o importa un onda quadra, elimina la metà inferiore, genera un triangolo, quindi prendi il tutto e duplicalo / ripetilo per tutti i periodi di cui hai bisogno.

Grazie per questi suggerimenti e dettagli. Conosco la sintesi granulare e la sintesi wavetable (grazie a Malström di Reason, che ha inventato l'ibrido: [graintable synthesis] (https://www.propellerheads.se/en/reason/instruments/malstrom)). Non ho mai usato Pure Data, ma solo ora l'ho scaricato in base alla tua raccomandazione. Uso Audacity, ma in un ambito limitato. In ogni caso apprezzo la tua risposta.
Your Uncle Bob
2018-09-12 10:45:34 UTC
view on stackexchange narkive permalink

Il modo per creare questo tipo di forma d'onda è combinare la sincronizzazione dell'oscillatore con la modulazione di ampiezza o la modulazione ad anello. Ecco una forma d'onda simile creata sincronizzando un'onda di impulso leggermente asimmetrica con un'onda triangolare sintonizzata circa 15 semitoni più in alto, e quindi modulando l'ampiezza dell'onda triangolare con l'onda di impulso.

(Sto usando un sintetizzatore analogico virtuale che ho realizzato in una vecchia versione di Reaktor per questo; impostando la manopola del mix dell'oscillatore intorno a 80 modula l'ampiezza dell'oscillatore 2 di 50% dell'oscillatore 2, il che significa che il segnale dell'impulso dall'oscillatore 1 varia da 0 a +1.)

Reaktor Juniper

Sebbene questa onda possa sembra interessante, suona molto come un'onda quadra diritta in avanti, perché i due salti nella forma d'onda hanno un impatto molto maggiore sul suono rispetto al bit triangolo-y.

Su campionatori di prima generazione come Casio FZ-1 e Korg DSS-1, disegnando forme d'onda come queste o combinando parti di forme d'onda diverse (molto simile al tuo disegno) era uno dei modi per creare nuovi suoni. Tuttavia, sui successivi campionatori e sintetizzatori di questi e di altri produttori, questa opzione era raramente presente, probabilmente perché non è un modo molto intuitivo per creare suoni utili.

In questo frammento da una brochure per il Korg DSS- 1 puoi vedere l'idea di combinare la metà superiore di un'onda a dente di sega con la metà inferiore di un'onda quadra illustrata, come esempio delle capacità del campionatore:

enter image description here

Eric Duminil
2018-09-12 14:05:52 UTC
view on stackexchange narkive permalink

Sulla base di questa risposta, ecco uno script Python modificato per approssimare la tua forma d'onda con pyaudio , scipy e numpy :

  import pyaudioimport numpy as npimport matplotlib.pyplot as pltfrom scipy import signalp = pyaudio.PyAudio () fs = 44100 # frequenza di campionamento, Hz, deve essere integerduration = 2.0 # in secondi, può be floatf = 440.0 # sine frequency, Hz, may be floatone_cycle = np.linspace (0, 2 * np.pi, int (fs / f), endpoint = False) waveform = np.concatenate ([signal.square (one_cycle, duty = 1.0) * 0.75 - 0.5, # 3/4 volume e segnale offset.sawtooth (one_cycle, width = 0.5) * 1.0, # Full volume # np.sin (one_cycle)]) samples = np.tile (waveform, int (fs * duration / len (waveform))) print (len (samples)) plt.plot (np.tile (waveform, 2)) plt.show () # per paFloat32 i valori di esempio devono essere compresi nell'intervallo [-1.0, 1.0 ] stream = p.open (format = pyaudio.paFloat32, channels = 1, rate = fs, output = True) stream. write (samples) stream.stop_stream () stream.close () p.terminate ()  

La forma d'onda ha questo aspetto:

enter preformatted text here

pyaudio riproduce il tono quando viene eseguito lo script Python.

È anche possibile salvarlo come file ".wav":

  from scipy.io import wavfilewavfile.write ('square_and_triangle.wav', fs, samples)  

Qui un secondo esempio.

Downvoter: per favore spiega.
Sì, seriamente, questa sembra essere un'ottima risposta!


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...