GitPedia

Wavefont

Typeface for rendering waveform/data

From dy·Updated June 15, 2026·View on GitHub·

A typeface for rendering vertical bars data: waveforms, spectrums, diagrams, histograms, columns etc. The project is written primarily in HTML, distributed under the SIL Open Font License 1.1 license, first published in 2016. Key topics include: afdko, barchart, chart, datavis, font.

Latest release: v3.1.1
December 16, 2022View Changelog →

wavefont build

A typeface for rendering vertical bars data: waveforms, spectrums, diagrams, histograms, columns etc.

<img src="./preview.png" width="240px"/>

Playground  •  Google fonts  •  V-fonts  •  
Wavearea

Usage

Place Wavefont[ROND,YELA,wght].woff2 into your project directory and use this code:

html
<style> @font-face { font-family: wavefont; font-display: block; src: url(./Wavefont[ROND,YELA,wght].woff2) format('woff2'); } .wavefont { --wght: 400; font-family: wavefont; font-variation-settings: 'wght' var(--wght), 'ROND' 30, 'YELA' 0; } </style> <!-- Set values manually --> <textarea id="waveform" class="wavefont" cols="100"> abcdefghijklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ </textarea> <script> // Set values programmatically (more precise) waveform.textContent = Array.from({length: 100}, (_,i) => String.fromCharCode(0x100 + i)).join('') </script>

Ranges

Wavefont bars correspond to values from 0 to 100, assigned to different characters:

  • <kbd>0-9</kbd> chars are for simplified manual input with step 10 (bar height = number).
  • <kbd>a-zA-Z</kbd> for manual input with step 2, softened at edges <kbd>a</kbd> and <kbd>Z</kbd> (bar height = number of letter).
  • <kbd>U+0100-017F</kbd> for 0..127 values with step 1 (char = String.fromCharCode(0x100 + value)).

Variable axes

TagRangeDefaultMeaning
wght1-1000400Bar width, or boldness.
ROND0-100100Border radius, or roundness (percent).
YELA-100-100-100Alignment: bottom, center or top.

To adjust axes via CSS:

css
.wavefont { font-variation-settings: 'wght' var(--wght, 40), 'ROND' var(--rond, 0), 'YELA' var(--align, 0); letter-spacing: 1ch; /* 1ch unit === 1 bar width */ }

Features

  • Ranges, values and width is compatible with linefont, so fonts can be switched preserving visual coherency.
  • Visible charcodes fall under marking characters unicode category, ie. recognized as word by regexp and can be selected with <kbd>Ctrl</kbd> + <kbd></kbd> or double click. Eg. waveform segments separated by or - are selectable by double click.
  • Characters outside of visible ranges are clipped to 0, eg. , \t etc.
  • -–._* map to 1 value, | maps to max value, ▁▂▃▄▅▆▇█ map to corresponding bars.
  • Accent acute <kbd> ́</kbd> (U+0301) shifts bar 1-step up, circumflex accent <kbd> ̂</kbd> (U+0302) 10-steps up. Eg. \u0101\u0302\u0302\u0301\u0301\u0301 shifts 23 steps up.
  • Accent grave <kbd> ̀</kbd> (U+0300) shifts bar 1-step down, caron <kbd> ̌</kbd> (U+030C) shifts 10 steps down, eg. \u0101\u030c\u0300\u0300\u0300 shifts 13 steps down.
  • Caret span is -20..120, so line-height = 1.4 is minimal non-overlapping selection.
<!-- * Anti-[FOUT](https://css-tricks.com/fout-foit-foft/): any character out of visible range is mapped to blank (similar to [Adobe Blank](https://github.com/adobe-fonts/adobe-blank-vf)). -->

JS package

Optional wavefont package exposes a function that calculates string from values for your convenience.

js
import wf from 'wavefont' // get characters for values from 0..127 range wf(0, 1, 50, 99, 127, ...) // ĀāIJţŤ...

Building

make build

See also

  • linefont − font-face for rendering linear data.

References

<!-- * [Unicode-table](https://symbl.cc/) − convenient unicode table.--> <p align="center"><a href="https://github.com/krishnized/license/">🕉</a><p>

Contributors

Showing top 5 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from dy/wavefont via the GitHub API.Last fetched: 6/17/2026