Giter Site home page Giter Site logo

bwhitman / alles Goto Github PK

View Code? Open in Web Editor NEW
202.0 6.0 13.0 81.68 MB

A many speaker distributed music synthesizer using UDP multicast over WiFi

Home Page: https://notes.variogram.com/2022/09/23/alles-amy/

License: MIT License

C 71.39% CMake 0.79% Python 4.28% Max 9.07% Makefile 1.30% JavaScript 4.28% Batchfile 0.02% HTML 2.03% CSS 3.47% Dockerfile 0.19% Jupyter Notebook 3.17%
synth wifi esp32

alles's Introduction

Alles - the mesh synthesizer

picture

You can now buy an Alles PCB from Blinkinlabs!

shore pine sound systems discord Chat about Alles on our Discord!

Check out this video!

The Alles mesh networking synthesizer - a field of sound at your control

Alles is a many-speaker distributed mesh synthesizer that responds over WiFi. Each synth -- there can be hundreds in a mesh -- supports up to 64 additive oscillators and 32 filters, with modulation / LFOs and ADSRs per oscillator. The mesh of speakers can be composed of any combination of our custom hardware speakers or programs running on computers. The software and hardware are open source: you can build it yourself or buy a PCB from us.

The synthesizers automatically form a mesh and listen to multicast WiFi messages. You can control the mesh from a host computer using any programming language or environments like Max or Pd.

We intended their first use as distributed / spatial version of an Alles Machine / Atari AMY additive synthesizer where each speaker represents up to 64 partials, all controlled as a group or individually. But you can just treat them as dozens of individual synthesizers and do whatever you want with them. It's pretty fun!

Want to try it today? Buy an Alles, build your own Alles, or install the software version, and then read our getting started tutorial!

Synthesizer specs

Each individual synth is powered by the AMY additive synthesizer library, you can read more details there. But at a high level, each Alles synth has:

  • 64 oscillators, each with adjustable frequency and amplitude:
    • pulse (+ adjustable duty cycle), sine, saw, triangle, noise and PCM, reading from a baked-in buffer of percussive and misc samples
    • karplus-strong string with adjustable feedback (can have up to 2 per synth)
    • An operator / algorithm-based frequency modulation synth, almost perfectly like a DX7
  • Up to 32 biquad low-pass, bandpass or hi-pass filters with cutoff and resonance, can be assigned to any oscillator
  • An additive partial synthesizer with an analysis front end to play back long strings of breakpoint-based sine waves
  • Control of speaker gain and 3-band parametric EQ
  • Built in patches for PCM, FM and partials

Using it -- hardware Alles

On first boot, each hardware speaker will create a captive wifi network called alles-synth-X where X is some ID of the synth. Join it (preferably on a mobile device), and you should get redirected to a captive wifi setup page. If not, go to http://10.10.0.1 in your browser after joining the network. Once you tell each synth what the wifi SSID and password you want it to join are, it will reboot. You only need to do that once per synth.

Using it -- software Alles

If you don't want to build or buy an Alles speaker, you can run Alles locally on your computer(s), as many as you want. As long as each copy of the software is running within the same network, they will automatically form in the mesh just like the hardware speakers. And the hardware and software speakers can be used interchangeably.

To build and run alles on a computer, simply clone this repository and

$ cd alles/main
$ make
$ ./alles
$ ./alles -h # shows all the useful commandline parameters, like changing which channel/sound card, or source IP address

Controlling the mesh

Check out our brand new Getting Started page for a tutorial!

You can control every synth on the mesh from a single host, using UDP over WiFi. You can address any synth in the mesh or all of them at once with one message, or use groups. This method can be used in music environments like Max or Pd, or by musicians or developers using languages like Python, or for plug-in developers who want to bridge Alles's full features to DAWs.

Alles's wire protocol is a series of numbers delimited by ascii characters that define all possible parameters of an oscillator. This is a design decision intended to make using Alles from any sort of environment as easy as possible, with no data structure or parsing overhead on the client. It's also readable and compact, far more expressive than MIDI and can be sent over network links, UARTs, or as arguments to functions or commands.

Alles accepts commands in ASCII, each command separated with a Z (you can group multiple messages in one, to avoid network overhead if that's your transport). Like so:

v0w4f440.0l0.9Z

See AMY's readme for the full list of synth parameters.

For higher throughput, it's recommended to batch many messages into one UDP message, up to 508 bytes per message. (alles.py does this for you, optionally.)

alles.py

Alles comes with its own full-featured client, written in Python. Feel free to adapt it or use it in your own clients. It can be seen as documentation, an API as well as a testing suite. You simply import alles and can control the entire mesh.

$ python3
>>> import alles
>>> alles.drums() # plays a drum pattern on all synths
>>> alles.drums(client=2) # just on one 

Or experiment with oscillators:

# use a a 0.25Hz sine wave at half phase (going down) to modify frequency of another sine wave
alles.reset()
alles.send(osc=1, wave=alles.SINE, vel=0.50, freq=0.25, phase=0.5) # LFO source oscillator
alles.send(osc=0, wave=alles.SINE, vel=0, bp0="0,500,0,0", bp0_target=alles.TARGET_AMP, mod_target=alles.TARGET_FREQ, mod_source=1)
alles.send(osc=0, note=60, vel=1.5) # Bass drum!
alles.send(osc=0, filter_freq=800, resonance=1.5) # filter it
alles.send(osc=0, note=50, vel=1.5) # note on

To see more examples, check out our brand new Getting Started page.

Addressing individual synthesizers

By default, a message is played by all booted synthesizers. But you can address them individually or in groups using the client parameter.

The synthesizers form a mesh that self-identify who is running. They get auto-addressed client_ids starting at 0 through 255. The first synth to be booted in the mesh gets 0, then 1, and so on. If a synth is shut off or otherwise no longer sends a heartbeat signal to the mesh, the client_ids will reform so that they are always contiguous. A synth may take 10-20 seconds to join the mesh and get assigned a client_id after booting, but it will immediately receive messages sent to all synths.

The client parameter wraps around given the number of booted synthesizers to make it easy on the composer. If you have 6 booted synths, a client of 0 only reaches the first synth, 1 only reaches the 2nd synth, and a client of 7 reaches the 2nd synth (7 % 6 = 1).

Setting client to a number greater than 255 allows you to address groups. For example, a client of 257 performs the following check on each booted synthesizer: my_client_id % (client-255) == 0. This would only address every other synthesizer. A client of 259 would address every fourth synthesizer, and so on.

You can read the heartbeat messages on your host if you want to enumerate the synthesizers locally, see sync below.

Timing & latency

Alles is not designed as a low latency real-time performance instrument, where your actions have an immediate effect on the sound. Changes you make on the host will take a fixed latency -- currently set at 1000ms by default -- to get to every synth. This fixed latency ensures that messages arrive to every synth -- both ESP32 based and those running on computers -- in the mesh in time to play in perfect sync, even though Wi-Fi's transmission latency varies widely. This allows you to have millisecond-accurate timing in your performance across dozens of speakers in a large space.

Your host should send along the time parameter of the relative time when you expect the sound to play. I'd suggest using the number of milliseconds since your host started, e.g. in Python:

def millis():
    d = datetime.datetime.now()
    return int((datetime.datetime.utcnow() - datetime.datetime(d.year, d.month, d.day)).total_seconds()*1000)

If using Max, use the cpuclock object as the time parameter.

The first time you send a message with time the synth mesh uses it to figure out the delta between its time and your expected time. (If you never send a time parameter, you're at the mercy of WiFi jitter.) Further messages will be millisecond accurate message-to-message, but with the fixed latency. You can adapt time per client if you want to account for speed-of-sound delay.

The time parameter is not meant to schedule things far in the future on the clients. If you send a new time that is outside 20,000ms from its expected delta, the clock base will re-compute. Your host should be the main "sequencer" and keep track of performance state and future events.

Latency is adjustable, if you are comfortable with your network you can set it lower, or if using a local (127.0.0.1) connection, or directly sending messages in code, you can set it to 0.

Enumerating synths

The sync command (see alles_util.sync()) triggers an immediate response back from each on-line synthesizer. The response looks like _s65201i4c248y2, where s is the time on the client, i is the index it is responding to, y has battery status (for versions that support that) and c is the client id. This lets you build a map of not only each booted synthesizer, but if you send many messages with different indexes, will also let you figure the round-trip latency for each one along with the reliability.

WiFi & reliability for performances

UDP multicast is naturally 'lossy' -- there is no guarantee that a message will be received by a synth. Depending on a lot of factors, but most especially your wireless router and the presence of other devices, that reliability can sometimes go as low as 70%. For performance purposes, I highly suggest using a dedicated wireless router instead of an existing WiFi network. You'll want to be able to turn off many "quality of service" features (these prioritize a randomly chosen synth and will make sync hard to work with), and you'll want to in the best case only have synthesizers as direct WiFi clients. An easy way to do this is to set up a dedicated wireless router but not wire any internet into it. Connect your laptop or host machine to the router over a wired connection (via a USB-ethernet adapter if you need one), but keep your laptop's wifi or other internet network active. In your controlling software, you simply set the source network address to send and receive multicast packets from. alles_util.py has setup code for this. This will keep your host machine on its normal network but allow you to control the synths from a second interface.

If you're in a place where you can't control your network, you can mitigate reliability by simply sending messages N times. Sending multiple duplicate messages (with the same time parameter) do not have any adverse effect on the synths.

Clients

Minimal Python example:

import socket
multicast_group = ('232.10.11.12', 9294)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

def send(oscillator=0, freq=0, vel=1):
    sock.sendto("v%df%fl%fZ" % (oscillator, freq, vel), multicast_group)

def c_major(octave=2):
    send(oscillator=0,freq=220.5*octave)
    send(oscillator=1,freq=138.5*octave)
    send(oscillator=2,freq=164.5*octave)

See alles.py for a better example. Any language that supports sockets and multicast can work, I encourage pull requests with new clients!

You can also easily use it in Max or Pd:

Max

Synthesizer Details

See AMY's readme for more details on the synthesizer itself.

Get your own Alles!

Buy an Alles

You can now buy an Alles PCB from Blinkinlabs!

If you want an Alles to use with your own speaker and battery, you can purchase an Alles PCB with screw connectors already attached. This lets you hook up any speaker and battery to Alles with no soldering. Alles can be powered over micro-USB with or without a battery, and if a battery is present the USB cable will charge the battery.

Read here how to install a PCB into a speaker shell!

If you want the small circular speakers shown on this page and videos, they are easy to get. Here's a link to them on Alibaba: the round A60s โ€“ the square-shaped A70s also work! You then can buy an Alles PCB from us with no terminals for speaker and battery -- the connections for the shell solder directly to the board. It takes me about 3 minutes to assemble the Alles PCB inside the A60 or A70 speaker. To do it this way, you only need a wire stripper, a small screwdriver and a soldering iron.

IMPORTANT: Alles is sold on a "best effort" community support basis. We will send you working PCBs with the latest Alles firmware loaded on them. Anything that happens after that is up to the community to help with. Alles requires a little bit of computer and networking know-how to get going. We've made it as easy as possible, we hope, but we know we have more work to do before this is ready for a very wide audience. Please use GitHub issues for anything you're having trouble with and we'll do our best to help you figure it out.

blinkinlabs PCB

DIY Alles

It's very simple to make one yourself with parts you can get from electronics distributors like Sparkfun, Adafruit or Amazon.

To make an Alles synth yourself, you need

A 5V input (USB battery, USB input, rechargeable batteries direct to power input) powers both boards and speaker at pretty good volumes. A 3.7V LiPo battery will also work, but note the I2S amp will not get as loud (without distorting) if you give it 3.7V. If you want your DIY Alles to be portable, I recommend using a USB battery pack that does not do low current shutoff. The draw of the whole unit at loud volumes is around 90mA, and at idle 40mA.

Wire up your DIY Alles like this (I2S -> ESP)

LRC -> GPIO25
BCLK -> GPIO26
DIN -> GPIO27
GAIN -> I2S Vin (i jumper this on the I2S board)
SD -> not connected
GND -> GND
Vin -> Vin / USB / 3.3 (or direct to your 5V power source)
Speaker connectors -> speaker

DIY Alles 1 DIY Alles 2

DIY bridge PCB

You don't need this PCB made to build a DIY Alles! -- it will work with just hookup wire. But if you're making a lot of DIY Alleses want more stability, I had a tiny little board made to join the boards together, like so:

closeup

This assumes you're using the suggested ESP32 dev board with its pin layout. If you use another one, you can probably change the GPIO assignments in alles.h. Fritzing file in the pcbs folder of this repository, and it's here on Aisler. This is a lot more stable and easier to wire up than snipping small bits of hookup wire, especially for the GAIN connection.

Disabling OTA for 4MB boards

If you are using your own dev board and it has less than 8MB of flash (4MB is common), first overwwrite alles_partitions.csv with the contents ofalles_4mb_partitions.csv as well as run idf.py menuconfig and change the flash size from 8MB to 4MB (in Serial Flasher Config) -- this will disable the OTA firmware upgrading, but will otherwise work fine. The binary for Alles is almost 4MB total and OTA needs space for two copies to be stored on the flash.

ESP32 Firmware

Alles is completely open source, and can be a fun platform to adapt beyond its current capabilities.

You can upgrade the firmware or write your own using the USB connection. See the guide on flashing a hardware Alles speaker (either DIY or one of ours).

THANK YOU TO

  • Alles would not be possible without the help of DAn Ellis, who helped me with most of the oscillator stack, a lot of deep dives into our algorithm synth, and many great ideas / fixes on the ESP32 code.
  • Douglas Repetto
  • Raph Levien for his work on MSFA which gave us a lot of hints for our FM implementation
  • mark fell
  • esp32 WiFi Manager
  • kyle mcdonald
  • Matt Mets / Blinkinlabs

TODO

  • power button
  • wifi setup should ask for default power saving / latency -- no for now
  • remove distortion at higher amplitudes for mixed sine waves
  • FM
  • should synths self-identify to each other? would make it easier to use in Max
  • see what you can do about wide swings of UDP latency on the netgear router
  • envelopes / note on/offs / LFOs
  • confirm UDP still works from Max/Pd
  • bandlimit the square/saw/triangle oscillators
  • karplus-strong
  • wifi hotspot mode for in-field setup
  • broadcast UDP for multiples
  • dropped packets
  • sync and enumerate across multiple devices
  • addresses / communicate to one or groups, like "play this on half / one-quarter / all"
  • do what i can about timing / jitter - sync time? timed messages?
  • case / battery setup
  • overloading the volume (I think only on FM) crashes
  • UDP message clicks
  • desktop USB flasher
  • BT / app based config instead of captive portal (later)

alles's People

Contributors

bwhitman avatar cibomahto avatar dpwe avatar kant avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

alles's Issues

Release parameter ignored on Note Off

When sending a Note Off to a long note (or maybe any note?), the release is ignored:

alles.send(osc=0, bp0="20000,10,5000,0", bp0_target=alles.TARGET_AMP, wave=alles.SINE,vel=0.1, note=60)

*wait a few seconds

alles.send(osc=0, vel=0)

The note is cut off quickly, rather than playing with a 5000ms release.

error when importing libamy

Hi...
after running:
sudo python3 setup.py install
and following the "Using amy.py's local mode" I'm getting this error:

>>> import amy, alles
Using 192.168.1.141 as local IP for multicast IF
>>> amy.live() # starts an audio callback thread to play audio in real time
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/kasparsj/Work/alles/amy.py", line 148, in live
    import libamy
ImportError: /usr/local/lib/python3.6/dist-packages/libamy.cpython-36m-x86_64-linux-gnu.so: undefined symbol: raw_file

lose sync after N days

I left on a hardware alles for ~5 days, and it still responded to UDP but the sync was all off, alles.drums() was sort of in swing-time. alles.sync() did not fix it. simple restart did.

hypothesis: wifi stack, or ms overflowed

merge latest alles / AMY / tulip

Alles, AMY & Tulip are three separate projects. I made a chart !

image

But we've made a lot of changes to the Amy in Tulip (stereo, reverb, chorus, IDF5.X) that aren't in AMY or Alles. We should figure out how to bring these all together. I imagine we can ship AMY in Alles and Tulip as submodules. We should back port as much as possible to AMY from Tulip and then treat Alles and Tulip as AMY "clients" (note that Tulip also does Alles-y things.)

  • do IDF5 porting for Alles
  • get AMY running with chorus / reverb in amy-example
  • ifdefs for stereo, reverb, chorus
  • see free RAM on Alles and maybe add them in
  • make AMY a submodule for Alles
  • make AMY a submodule for Tulip

Single synth wired setup

Hi there. Great project! I wonder, would it not be possible for a single synth connected through wired midi to still produce sound? For testing purposes or just for a single synth setup. Or maybe even consider wired setup where few synths connected into a kind of cluster. Many thanks.

User testing notes

Some configurations seem to take time to setup, so setting up then immediately playing a note doesn't work.

Running this all in one go will not play a chime:

alles.reset()
alles.send(wave=alles.SINE,ratio=0.2,amp=0.1,osc=0,bp0_target=alles.TARGET_AMP,bp0="1000,0,0,0")
alles.send(wave=alles.SINE,ratio=1,amp=1,osc=1)
alles.send(wave=alles.ALGO,algorithm=0,algo_source="-1,-1,-1,-1,1,0",osc=2)
alles.send(osc=2, note=60, vel=3)

But a delay before the last command will work. Or adding ..., note=60, vel=3) to play that note in the second to last command.

Setting an oscillator vel to 0 doesn't seem to work. Start a sine:

alles.send(osc=0, wave=alles.SINE, freq=220, amp=1)
alles.send(osc=0, vel=1)

Then try to turn it off with alles.send(osc=0, vel=0) and nothing happens. Using vel=0.01 effectively turns it off.

deb_menu.midi in the Max patch is missing from the repo. Not that I'm ready to send raw commands to Alles yet :) But I would be curious to see Max working. It looks like I have to paste in the broadcast address too, while import alles already detects it automatically.

amy: ADSR envelope for SINE, SAW... doesn't do Attack properly

It looks the Attack segment goes to max amp over the first 5.8ms window, then sits there until the end of the attack segment. It's supposed to ramp up gradually across the entire attack time.

Thus,

alles.send(osc=0, bp0='100,1.0,1000,0.0,0,0.0', bp0_target=alles.TARGET_AMP)
alles.send(osc=0, freq=2000, vel=1)

generates a waveform like this:
image

Notice how the envelope is basically rectangular for the first 100ms, before beginning its decay.

Later alles commits not loading RAM properly on revB+ boards

Getting memory alloc errors for some reason. Need to investigate. The commit without AMY as a submodule works fine, so if you're seeing

Guru Meditation Error: Core  0 panic'ed (LoadStoreError). Exception was unhandled.

Core  0 register dump:
PC      : 0x400d958e  PS      : 0x00060e30  A0      : 0x800daed9  A1      : 0x3ffbce80  
0x400d958e: oscs_init at /Users/bwhitman/outside/alles/amy/src/amy.c:406

Do this

gh repo clone bwhitman/alles
cd alles
git checkout e481edc

Clipping involves too many flops: Replace with lookup table

The "soft clipping" logic in alles.c includes a substantial number of floating-point ops per sample when the sample values are within 10% of the clip rail.

This could have nasty consequences if the clip logic causes the processing to underrun when it deploys.

A more efficient solution is to replace the x - (x^3)/3 calculation with a lookup table, and have the whole thing be done in the int16 domain. We'd only need 1.5 * 0.1 * 32768 = ~5k 16 bit entries in the table, and the cost per sample would be one table lookup, rather than what looks like at least 5 floating-point ops.

something like:

#define INT16_MAX 32767
#define LIN_MAX 29491 // int(round(0.9 * 32768))
#define NONLIN_RANGE 4915 // size of nonlinearity lookup table = round(1.5 * (INT16_MAX - LINMAX))
#define NONLIN_MAX (LIN_MAX + NONLIN_RANGE) // 34406, too big for signed int16

s = sgn(floatval);
uint16 uintval = (int)(s * floatval * INT16_MAX); // s*floatval will be nonnegative; using a uint gives us factor-of-2 headroom
if (uintval > LIN_MAX) {
if (uintval > NONLIN_MAX) {
uintval = INT16_MAX;
} else {
uintval = clipping_lookup_table[uintval - LIN_MAX];
}
int16 final_sample = s * uintval;

and clipping_lookup_table is initialized to:

uint16 clipping_lookup_table[NONLIN_RANGE]; // largest value will be 32767, but call it uint because it's going into uintval
for (int x = 0; x < NONLIN_RANGE;++x) {
float x_dash = ((float)x) / NONLIN_RANGE;
clipping_lookup_table[x] = LIN_MAX + int(floor(NONLIN_RANGE * (x_dash - x_dash * x_dash * x_dash / 3.0)));
}

but of course you'd precalculate that into a const float[] header file.

Alles no longer builds on recent ESP-IDF versions

I flashed three NodeMCUs with the Alles firmware. The instructions for flashing Alles at https://github.com/bwhitman/alles/blob/main/alles-flashing.md mention "You should first install ESP-IDF on your system if you haven't already. We tend to use the master branch of the IDF as we use some newer features."

It seems the latest master and 5.x in general no longer work with the current version of Alles code, based on the amount of compile errors I got when following the instructions. After checking out 4.4 and updating submodules, flashing was successful.

Perhaps the documentation should be updated to reflect that one should specifically install ESP-IDF 4.4 - or the codebase updated to support 5.x? I'm not sure which one is the desired short term fix, so made an issue instead of a PR suggestion.

Boot loop

I just bought a couple esp32 dev boards off of amazon to try this out. I was able to build the software and flash the board. All seemed ok, but I don't see any new wifi networks. My board has 4mb of flash, so I overwrote alles_partitions.csv with alles_4mb_partitions.csv. The generated alles.bin file is 4mb.

I tried the serial monitor and it seems to be stuck in a boot loop. This is the output from the serial monitor (which seems to be complaining about the flash size):

ELF file SHA256: 61892cde1dad644f

Rebooting...
ets Jul 29 2019 12:21:46

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:6680
load:0x40078000,len:14944
load:0x40080400,len:3816
0x40080400: _init at ??:?

entry 0x40080698
I (27) boot: ESP-IDF v4.4.4-148-g4c2afac355 2nd stage bootloader
I (27) boot: compile time 11:53:35
I (27) boot: chip revision: v3.0
I (32) boot_comm: chip revision: 3, min. bootloader chip revision: 0
I (39) boot.esp32: SPI Speed : 40MHz
I (43) boot.esp32: SPI Mode : DIO
I (48) boot.esp32: SPI Flash Size : 8MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label Usage Type ST Offset Length
I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (76) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (84) boot: 2 factory factory app 00 00 00010000 003ee000
I (91) boot: End of partition table
I (95) boot_comm: chip revision: 3, min. application chip revision: 0
I (102) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=316a5ch (3238492) map
I (1283) esp_image: segment 1: paddr=00326a84 vaddr=3ff80063 size=00008h ( 8) load
I (1283) esp_image: segment 2: paddr=00326a94 vaddr=3ffb0000 size=03284h ( 12932) load
I (1294) esp_image: segment 3: paddr=00329d20 vaddr=40080000 size=062f8h ( 25336) load
I (1308) esp_image: segment 4: paddr=00330020 vaddr=400d0020 size=a1640h (661056) map
I (1547) esp_image: segment 5: paddr=003d1668 vaddr=400862f8 size=0f8a8h ( 63656) load
I (1574) esp_image: segment 6: paddr=003e0f18 vaddr=400c0000 size=00064h ( 100) load
I (1584) boot: Loaded app from partition at offset 0x10000
I (1585) boot: Disabling RNG early entropy source...
I (1596) cpu_start: Pro cpu up.
I (1597) cpu_start: Starting app cpu, entry point is 0x4008134c
0x4008134c: call_start_cpu1 at /Users/corey/Development/esp/esp-idf/components/esp_system/port/cpu_start.c:148

I (1583) cpu_start: App cpu up.
I (1613) cpu_start: Pro cpu start user code
I (1613) cpu_start: cpu freq: 240000000
I (1613) cpu_start: Application information:
I (1618) cpu_start: Project name: alles
I (1623) cpu_start: App version: v0.2-alpha-18-g045edf3-dirty
I (1630) cpu_start: Compile time: Feb 25 2023 11:53:33
I (1636) cpu_start: ELF file SHA256: 61892cde1dad644f...
I (1642) cpu_start: ESP-IDF: v4.4.4-148-g4c2afac355
I (1649) heap_init: Initializing. RAM available for dynamic allocation:
I (1656) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (1662) heap_init: At 3FFBAA20 len 000255E0 (149 KiB): DRAM
I (1668) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (1675) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1681) heap_init: At 40095BA0 len 0000A460 (41 KiB): IRAM
I (1689) spi_flash: detected chip: winbond
I (1692) spi_flash: flash io: dio
E (1696) spi_flash: Detected size(4096k) smaller than the size in the binary image header(8192k). Probe failed.

assert failed: do_core_init startup.c:326 (flash_ret == ESP_OK)

Backtrace: 0x40081d22:0x3ffe3aa0 0x40089955:0x3ffe3ac0 0x4009064a:0x3ffe3ae0 0x400d322f:0x3ffe3c00 0x4008166d:0x3ffe3c40 0x40079494:0x3ffe3c80 |<-CORRUPTED
0x40081d22: panic_abort at /Users/corey/Development/esp/esp-idf/components/esp_system/panic.c:408

0x40089955: esp_system_abort at /Users/corey/Development/esp/esp-idf/components/esp_system/esp_system.c:137

0x4009064a: __assert_func at /Users/corey/Development/esp/esp-idf/components/newlib/assert.c:85

0x400d322f: do_core_init at /Users/corey/Development/esp/esp-idf/components/esp_system/startup.c:326
(inlined by) start_cpu0_default at /Users/corey/Development/esp/esp-idf/components/esp_system/startup.c:433

0x4008166d: call_start_cpu0 at /Users/corey/Development/esp/esp-idf/components/esp_system/port/cpu_start.c:632

Get working on 5.x ESP-IDF

  • mdns is now a separate component
  • use new i2s component
  • multicast ip_info etc all different
  • esp32_wifi_manager needs an update
  • printf type
  • OTA failing

WiFi authentication page doesn't work on recent Android

Using a freshly built Alles image, I get the message "Header fields are too long for server to interpret" after connecting to the WiFi from my Android phone:

2023-06-20 13 52 35

Steps to reproduce:

  1. Build Alles binary (using Docker image to ensure clean environment)
  2. Load binary onto Alles, reboot
  3. On phone, connect to the new wifi network
  4. Wait until the 'sign into wifi network' prompt appears, then accept it
  5. The phone shows the above page

If I manually configure the phone to use the wifi network without a connection, then open http://10.10.0.1 in a browser, the configuration page is able to load.

I think the solution is simple- CONFIG_HTTPD_MAX_REQ_HDR_LEN needs to be increased:
https://github.com/bwhitman/alles/blob/main/sdkconfig#L375

For instance to 1024:
https://esp32.com/viewtopic.php?t=28702

FM: algo_setup_patch

  • needs to support up to two LFOs (osc 7 and 8)
  • needs to use TARGET_TRUE_EXPONENTIAL
  • needs to ignore per-op detune (??)

Make work with new AMY

Biggest change for Alles is that we need to now handle the semaphores directly instead of relying on AMY to do it.

eq no longer working

import alles

alles.eq_test()
Traceback (most recent call last):
File "", line 1, in
File "/Users/douglas/Downloads/alles-main/alles.py", line 208, in eq_test
eset()
NameError: name 'eset' is not defined

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.